summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2010-04-06 16:58:52 -0700
committerKen Thompson <ken@golang.org>2010-04-06 16:58:52 -0700
commit684f01b4dd2cd6bec2bd9725a230902229e576a4 (patch)
tree6eb3f23c569dbd6ba2efae57feadbf42805d4a0a
parent7425b14f81f1d1e4ace3b79187533ce0b06ab636 (diff)
downloadgolang-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.c15
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);