]> Cypherpunks repositories - gostls13.git/commitdiff
change channel read to clear
authorKen Thompson <ken@golang.org>
Tue, 6 Apr 2010 23:58:52 +0000 (16:58 -0700)
committerKen Thompson <ken@golang.org>
Tue, 6 Apr 2010 23:58:52 +0000 (16:58 -0700)
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

index 6e3d81a96f7986b24dcea15eb585cfe6d81b37ea..1f4dd0e1c4a532ff9b0e414947ab5d04295acb6d 100644 (file)
@@ -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);