1
0
mirror of https://github.com/golang/go synced 2024-11-18 15:54:42 -07:00

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
This commit is contained in:
Ken Thompson 2010-04-06 16:58:52 -07:00
parent caa149f73d
commit dec248c665

View 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);