static void timerproc ( void ) { int64 delta , now; Timer *t; void ( *f ) ( int64 , Eface ) ; Eface arg; #line 198 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" for ( ;; ) { runtime·lock ( &timers ) ; timers.sleeping = false; now = runtime·nanotime ( ) ; for ( ;; ) { if ( timers.len == 0 ) { delta = -1; break; } t = timers.t[0]; delta = t->when - now; if ( delta > 0 ) break; if ( t->period > 0 ) { #line 213 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" t->when += t->period * ( 1 + -delta/t->period ) ; siftdown ( 0 ) ; } else { #line 217 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" timers.t[0] = timers.t[--timers.len]; timers.t[0]->i = 0; siftdown ( 0 ) ; t->i = -1; } f = ( void* ) t->fv->fn; arg = t->arg; runtime·unlock ( &timers ) ; if ( raceenabled ) runtime·raceacquire ( t ) ; f ( now , arg ) ; #line 230 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" f = nil; USED ( f ) ; arg.type = nil; arg.data = nil; USED ( &arg ) ; #line 236 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" runtime·lock ( &timers ) ; } if ( delta < 0 ) { #line 240 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" timers.rescheduling = true; runtime·parkunlock ( &timers , "timer goroutine (idle)" ) ; continue; } #line 245 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" timers.sleeping = true; runtime·noteclear ( &timers.waitnote ) ; runtime·unlock ( &timers ) ; runtime·notetsleepg ( &timers.waitnote , delta ) ; } }
void runtime·tsleep ( int64 ns , int8 *reason ) { Timer t; #line 78 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" if ( ns <= 0 ) return; #line 81 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" t.when = runtime·nanotime ( ) + ns; t.period = 0; t.fv = &readyv; t.arg.data = g; runtime·lock ( &timers ) ; addtimer ( &t ) ; runtime·parkunlock ( &timers , reason ) ; }
static bool chansend ( ChanType *t , Hchan *c , byte *ep , bool block , void *pc ) { SudoG *sg; SudoG mysg; G* gp; int64 t0; #line 82 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( raceenabled ) runtime·racereadobjectpc ( ep , t->elem , runtime·getcallerpc ( &t ) , chansend ) ; #line 85 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( c == nil ) { USED ( t ) ; if ( !block ) return false; runtime·park ( nil , nil , "chan send (nil chan)" ) ; return false; } #line 93 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( debug ) { runtime·printf ( "chansend: chan=%p; elem=" , c ) ; c->elemtype->alg->print ( c->elemsize , ep ) ; runtime·prints ( "\n" ) ; } #line 99 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" t0 = 0; mysg.releasetime = 0; if ( runtime·blockprofilerate > 0 ) { t0 = runtime·cputicks ( ) ; mysg.releasetime = -1; } #line 106 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" runtime·lock ( c ) ; if ( raceenabled ) runtime·racereadpc ( c , pc , chansend ) ; if ( c->closed ) goto closed; #line 112 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( c->dataqsiz > 0 ) goto asynch; #line 115 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" sg = dequeue ( &c->recvq ) ; if ( sg != nil ) { if ( raceenabled ) racesync ( c , sg ) ; runtime·unlock ( c ) ; #line 121 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" gp = sg->g; gp->param = sg; if ( sg->elem != nil ) c->elemtype->alg->copy ( c->elemsize , sg->elem , ep ) ; if ( sg->releasetime ) sg->releasetime = runtime·cputicks ( ) ; runtime·ready ( gp ) ; return true; } #line 131 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( !block ) { runtime·unlock ( c ) ; return false; } #line 136 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" mysg.elem = ep; mysg.g = g; mysg.selectdone = nil; g->param = nil; enqueue ( &c->sendq , &mysg ) ; runtime·parkunlock ( c , "chan send" ) ; #line 143 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( g->param == nil ) { runtime·lock ( c ) ; if ( !c->closed ) runtime·throw ( "chansend: spurious wakeup" ) ; goto closed; } #line 150 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( mysg.releasetime > 0 ) runtime·blockevent ( mysg.releasetime - t0 , 2 ) ; #line 153 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" return true; #line 155 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" asynch: if ( c->closed ) goto closed; #line 159 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( c->qcount >= c->dataqsiz ) { if ( !block ) { runtime·unlock ( c ) ; return false; } mysg.g = g; mysg.elem = nil; mysg.selectdone = nil; enqueue ( &c->sendq , &mysg ) ; runtime·parkunlock ( c , "chan send" ) ; #line 170 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" runtime·lock ( c ) ; goto asynch; } #line 174 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( raceenabled ) { runtime·raceacquire ( chanbuf ( c , c->sendx ) ) ; runtime·racerelease ( chanbuf ( c , c->sendx ) ) ; } #line 179 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" c->elemtype->alg->copy ( c->elemsize , chanbuf ( c , c->sendx ) , ep ) ; if ( ++c->sendx == c->dataqsiz ) c->sendx = 0; c->qcount++; #line 184 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" sg = dequeue ( &c->recvq ) ; if ( sg != nil ) { gp = sg->g; runtime·unlock ( c ) ; if ( sg->releasetime ) sg->releasetime = runtime·cputicks ( ) ; runtime·ready ( gp ) ; } else runtime·unlock ( c ) ; if ( mysg.releasetime > 0 ) runtime·blockevent ( mysg.releasetime - t0 , 2 ) ; return true; #line 197 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" closed: runtime·unlock ( c ) ; runtime·panicstring ( "send on closed channel" ) ; return false; }
static bool chanrecv ( ChanType *t , Hchan* c , byte *ep , bool block , bool *received ) { SudoG *sg; SudoG mysg; G *gp; int64 t0; #line 214 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( debug ) runtime·printf ( "chanrecv: chan=%p\n" , c ) ; #line 217 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( c == nil ) { USED ( t ) ; if ( !block ) return false; runtime·park ( nil , nil , "chan receive (nil chan)" ) ; return false; } #line 225 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" t0 = 0; mysg.releasetime = 0; if ( runtime·blockprofilerate > 0 ) { t0 = runtime·cputicks ( ) ; mysg.releasetime = -1; } #line 232 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" runtime·lock ( c ) ; if ( c->dataqsiz > 0 ) goto asynch; #line 236 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( c->closed ) goto closed; #line 239 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" sg = dequeue ( &c->sendq ) ; if ( sg != nil ) { if ( raceenabled ) racesync ( c , sg ) ; runtime·unlock ( c ) ; #line 245 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( ep != nil ) c->elemtype->alg->copy ( c->elemsize , ep , sg->elem ) ; gp = sg->g; gp->param = sg; if ( sg->releasetime ) sg->releasetime = runtime·cputicks ( ) ; runtime·ready ( gp ) ; #line 253 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( received != nil ) *received = true; return true; } #line 258 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( !block ) { runtime·unlock ( c ) ; return false; } #line 263 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" mysg.elem = ep; mysg.g = g; mysg.selectdone = nil; g->param = nil; enqueue ( &c->recvq , &mysg ) ; runtime·parkunlock ( c , "chan receive" ) ; #line 270 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( g->param == nil ) { runtime·lock ( c ) ; if ( !c->closed ) runtime·throw ( "chanrecv: spurious wakeup" ) ; goto closed; } #line 277 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( received != nil ) *received = true; if ( mysg.releasetime > 0 ) runtime·blockevent ( mysg.releasetime - t0 , 2 ) ; return true; #line 283 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" asynch: if ( c->qcount <= 0 ) { if ( c->closed ) goto closed; #line 288 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( !block ) { runtime·unlock ( c ) ; if ( received != nil ) *received = false; return false; } mysg.g = g; mysg.elem = nil; mysg.selectdone = nil; enqueue ( &c->recvq , &mysg ) ; runtime·parkunlock ( c , "chan receive" ) ; #line 300 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" runtime·lock ( c ) ; goto asynch; } #line 304 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( raceenabled ) { runtime·raceacquire ( chanbuf ( c , c->recvx ) ) ; runtime·racerelease ( chanbuf ( c , c->recvx ) ) ; } #line 309 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( ep != nil ) c->elemtype->alg->copy ( c->elemsize , ep , chanbuf ( c , c->recvx ) ) ; c->elemtype->alg->copy ( c->elemsize , chanbuf ( c , c->recvx ) , nil ) ; if ( ++c->recvx == c->dataqsiz ) c->recvx = 0; c->qcount--; #line 316 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" sg = dequeue ( &c->sendq ) ; if ( sg != nil ) { gp = sg->g; runtime·unlock ( c ) ; if ( sg->releasetime ) sg->releasetime = runtime·cputicks ( ) ; runtime·ready ( gp ) ; } else runtime·unlock ( c ) ; #line 326 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" if ( received != nil ) *received = true; if ( mysg.releasetime > 0 ) runtime·blockevent ( mysg.releasetime - t0 , 2 ) ; return true; #line 332 "/tmp/makerelease402042453/go/src/pkg/runtime/chan.goc" closed: if ( ep != nil ) c->elemtype->alg->copy ( c->elemsize , ep , nil ) ; if ( received != nil ) *received = false; if ( raceenabled ) runtime·raceacquire ( c ) ; runtime·unlock ( c ) ; if ( mysg.releasetime > 0 ) runtime·blockevent ( mysg.releasetime - t0 , 2 ) ; return true; }