From dec248c6654cde9f556780c64769628920827e92 Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Tue, 6 Apr 2010 16:58:52 -0700 Subject: [PATCH] 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 https://golang.org/cl/882043 --- src/pkg/runtime/chan.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/pkg/runtime/chan.c b/src/pkg/runtime/chan.c index 6e3d81a96f..1f4dd0e1c4 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); -- 2.48.1