diff options
author | Ken Thompson <ken@golang.org> | 2010-04-06 16:58:52 -0700 |
---|---|---|
committer | Ken Thompson <ken@golang.org> | 2010-04-06 16:58:52 -0700 |
commit | 684f01b4dd2cd6bec2bd9725a230902229e576a4 (patch) | |
tree | 6eb3f23c569dbd6ba2efae57feadbf42805d4a0a | |
parent | 7425b14f81f1d1e4ace3b79187533ce0b06ab636 (diff) | |
download | golang-684f01b4dd2cd6bec2bd9725a230902229e576a4.tar.gz |
change channel read to clear
data just read from the channel.
this will make it easier to
recognize when to garbage
collect and finalize.
R=rsc
CC=golang-dev
http://codereview.appspot.com/882043
-rw-r--r-- | src/pkg/runtime/chan.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/pkg/runtime/chan.c b/src/pkg/runtime/chan.c index 6e3d81a96..1f4dd0e1c 100644 --- a/src/pkg/runtime/chan.c +++ b/src/pkg/runtime/chan.c @@ -300,6 +300,7 @@ loop: sg = dequeue(&c->sendq, c); if(sg != nil) { c->elemalg->copy(c->elemsize, ep, sg->elem); + c->elemalg->copy(c->elemsize, sg->elem, nil); gp = sg->g; gp->param = sg; @@ -331,6 +332,7 @@ loop: goto loop; c->elemalg->copy(c->elemsize, ep, sg->elem); + c->elemalg->copy(c->elemsize, sg->elem, nil); freesg(c, sg); unlock(c); return; @@ -356,6 +358,7 @@ asynch: goto asynch; } c->elemalg->copy(c->elemsize, ep, c->recvdataq->elem); + c->elemalg->copy(c->elemsize, c->recvdataq->elem, nil); c->recvdataq = c->recvdataq->link; c->qcount--; sg = dequeue(&c->sendq, c); @@ -778,8 +781,10 @@ loop: sel, c, cas, cas->send, o); if(!cas->send) { - if(cas->u.elemp != nil) + if(cas->u.elemp != nil) { c->elemalg->copy(c->elemsize, cas->u.elemp, sg->elem); + c->elemalg->copy(c->elemsize, sg->elem, nil); + } } freesg(c, sg); @@ -787,8 +792,10 @@ loop: asyncrecv: // can receive from buffer - if(cas->u.elemp != nil) + if(cas->u.elemp != nil) { c->elemalg->copy(c->elemsize, cas->u.elemp, c->recvdataq->elem); + c->elemalg->copy(c->elemsize, c->recvdataq->elem, nil); + } c->recvdataq = c->recvdataq->link; c->qcount--; sg = dequeue(&c->sendq, c); @@ -817,8 +824,10 @@ syncrecv: // can receive from sleeping sender (sg) if(debug) printf("syncrecv: sel=%p c=%p o=%d\n", sel, c, o); - if(cas->u.elemp != nil) + if(cas->u.elemp != nil) { c->elemalg->copy(c->elemsize, cas->u.elemp, sg->elem); + c->elemalg->copy(c->elemsize, sg->elem, nil); + } gp = sg->g; gp->param = sg; ready(gp); |