void net·runtime_pollSetDeadline(PollDesc* pd, int64 d, intgo mode) { #line 123 "/tmp/bindist907131767/go/src/pkg/runtime/netpoll.goc" runtime·lock(pd); if(pd->closing) goto ret; pd->seq++; // invalidate current timers // Reset current timers. if(pd->rt.fv) { runtime·deltimer(&pd->rt); pd->rt.fv = nil; } if(pd->wt.fv) { runtime·deltimer(&pd->wt); pd->wt.fv = nil; } // Setup new timers. if(d != 0 && d <= runtime·nanotime()) { d = -1; } if(mode == 'r' || mode == 'r'+'w') pd->rd = d; if(mode == 'w' || mode == 'r'+'w') pd->wd = d; if(pd->rd > 0 && pd->rd == pd->wd) { pd->rt.fv = &deadlineFn; pd->rt.when = pd->rd; // Copy current seq into the timer arg. // Timer func will check the seq against current descriptor seq, // if they differ the descriptor was reused or timers were reset. pd->rt.arg.type = (Type*)pd->seq; pd->rt.arg.data = pd; runtime·addtimer(&pd->rt); } else { if(pd->rd > 0) { pd->rt.fv = &readDeadlineFn; pd->rt.when = pd->rd; pd->rt.arg.type = (Type*)pd->seq; pd->rt.arg.data = pd; runtime·addtimer(&pd->rt); } if(pd->wd > 0) { pd->wt.fv = &writeDeadlineFn; pd->wt.when = pd->wd; pd->wt.arg.type = (Type*)pd->seq; pd->wt.arg.data = pd; runtime·addtimer(&pd->wt); } } ret: runtime·unlock(pd); }
void runtime·addtimer ( Timer *t ) { runtime·lock ( &timers ) ; addtimer ( t ) ; runtime·unlock ( &timers ) ; }
void time·startTimer(Timer* t) { #line 43 "/home/14/ren/source/golang/go/src/pkg/runtime/time.goc" if(raceenabled) runtime·racerelease(t); runtime·addtimer(t); }
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 ) ; }
void net·runtime_pollSetDeadline(PollDesc* pd, int64 d, intgo mode) { #line 164 "C:\Users\gopher\AppData\Local\Temp\1\makerelease745458658\go\src\pkg\runtime\netpoll.goc" G *rg, *wg; runtime·lock(pd); if(pd->closing) { runtime·unlock(pd); return; } pd->seq++; // invalidate current timers // Reset current timers. if(pd->rt.fv) { runtime·deltimer(&pd->rt); pd->rt.fv = nil; } if(pd->wt.fv) { runtime·deltimer(&pd->wt); pd->wt.fv = nil; } // Setup new timers. if(d != 0 && d <= runtime·nanotime()) d = -1; if(mode == 'r' || mode == 'r'+'w') pd->rd = d; if(mode == 'w' || mode == 'r'+'w') pd->wd = d; if(pd->rd > 0 && pd->rd == pd->wd) { pd->rt.fv = &deadlineFn; pd->rt.when = pd->rd; // Copy current seq into the timer arg. // Timer func will check the seq against current descriptor seq, // if they differ the descriptor was reused or timers were reset. pd->rt.arg.type = (Type*)pd->seq; pd->rt.arg.data = pd; runtime·addtimer(&pd->rt); } else { if(pd->rd > 0) { pd->rt.fv = &readDeadlineFn; pd->rt.when = pd->rd; pd->rt.arg.type = (Type*)pd->seq; pd->rt.arg.data = pd; runtime·addtimer(&pd->rt); } if(pd->wd > 0) { pd->wt.fv = &writeDeadlineFn; pd->wt.when = pd->wd; pd->wt.arg.type = (Type*)pd->seq; pd->wt.arg.data = pd; runtime·addtimer(&pd->wt); } } // If we set the new deadline in the past, unblock currently pending IO if any. rg = nil; runtime·atomicstorep(&wg, nil); // full memory barrier between stores to rd/wd and load of rg/wg in netpollunblock if(pd->rd < 0) rg = netpollunblock(pd, 'r', false); if(pd->wd < 0) wg = netpollunblock(pd, 'w', false); runtime·unlock(pd); if(rg) runtime·ready(rg); if(wg) runtime·ready(wg); }
void net·runtime_pollSetDeadline(PollDesc* pd, int64 d, intgo mode) { #line 136 "/tmp/makerelease886106415/go/src/pkg/runtime/netpoll.goc" G *rg, *wg; runtime·lock(pd); if(pd->closing) { runtime·unlock(pd); return; } pd->seq++; // invalidate current timers // Reset current timers. if(pd->rt.fv) { runtime·deltimer(&pd->rt); pd->rt.fv = nil; } if(pd->wt.fv) { runtime·deltimer(&pd->wt); pd->wt.fv = nil; } // Setup new timers. if(d != 0 && d <= runtime·nanotime()) d = -1; if(mode == 'r' || mode == 'r'+'w') pd->rd = d; if(mode == 'w' || mode == 'r'+'w') pd->wd = d; if(pd->rd > 0 && pd->rd == pd->wd) { pd->rt.fv = &deadlineFn; pd->rt.when = pd->rd; // Copy current seq into the timer arg. // Timer func will check the seq against current descriptor seq, // if they differ the descriptor was reused or timers were reset. pd->rt.arg.type = (Type*)pd->seq; pd->rt.arg.data = pd; runtime·addtimer(&pd->rt); } else { if(pd->rd > 0) { pd->rt.fv = &readDeadlineFn; pd->rt.when = pd->rd; pd->rt.arg.type = (Type*)pd->seq; pd->rt.arg.data = pd; runtime·addtimer(&pd->rt); } if(pd->wd > 0) { pd->wt.fv = &writeDeadlineFn; pd->wt.when = pd->wd; pd->wt.arg.type = (Type*)pd->seq; pd->wt.arg.data = pd; runtime·addtimer(&pd->wt); } } // If we set the new deadline in the past, unblock currently pending IO if any. rg = nil; wg = nil; if(pd->rd < 0) rg = netpollunblock(pd, 'r', false); if(pd->wd < 0) wg = netpollunblock(pd, 'w', false); runtime·unlock(pd); if(rg) runtime·ready(rg); if(wg) runtime·ready(wg); }