From: Ken Thompson Date: Wed, 16 Jul 2008 18:46:33 +0000 (-0700) Subject: chan bool offset bug X-Git-Tag: weekly.2009-11-06~3482 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=90da10d7ac0774f4544ac3476d9d234a21afbbb5;p=gostls13.git chan bool offset bug SVN=127537 --- diff --git a/src/runtime/chan.c b/src/runtime/chan.c index 6bc08ae0fb..926e14ba7c 100644 --- a/src/runtime/chan.c +++ b/src/runtime/chan.c @@ -15,7 +15,8 @@ struct Hchan uint32 dataqsiz; // size of the circular q uint32 qcount; // total data in the q uint32 eo; // vararg of element - uint32 po; // vararg of present bool + uint32 po1; // vararg of present bool in next structure + uint32 po2; // vararg of present bool in same structure Alg* elemalg; // interface for element type Link* senddataq; // pointer for sender Link* recvdataq; // pointer for receiver @@ -74,7 +75,8 @@ sys·newchan(uint32 elemsize, uint32 elemalg, uint32 hint, // these calculations are compiler dependent c->eo = rnd(sizeof(c), elemsize); - c->po = rnd(c->eo+elemsize, 1); + c->po1 = rnd(c->eo+elemsize, 8); // next structure + c->po2 = rnd(c->eo+elemsize, 1); // same structure ret = c; FLUSH(&ret); @@ -90,7 +92,6 @@ sys·newchan(uint32 elemsize, uint32 elemalg, uint32 hint, sys·printint(c->dataqsiz); prints("\n"); } - } // chansend1(hchan *chan any, elem any); @@ -145,7 +146,8 @@ sys·chansend2(Hchan* c, ...) G *gr; ae = (byte*)&c + c->eo; - ap = (byte*)&c + c->po; + ap = (byte*)&c + c->po1; + if(debug) { prints("chansend: chan="); sys·printpointer(c); @@ -230,7 +232,8 @@ sys·chanrecv2(Hchan* c, ...) G *gs; ae = (byte*)&c + c->eo; - ap = (byte*)&c + c->po; + ap = (byte*)&c + c->po2; + if(debug) { prints("chanrecv2: chan="); sys·printpointer(c);