mirror of https://github.com/golang/go.git
runtime: introduce notetsleepg function
notetsleepg is the same as notetsleep, but is called on user g. It includes entersyscall/exitsyscall and will help to avoid split stack functions in syscall status. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/11681043
This commit is contained in:
parent
9fe4a9ecdd
commit
e97d677b4e
|
|
@ -358,9 +358,7 @@ getprofile(Profile *p)
|
|||
return ret;
|
||||
|
||||
// Wait for new log.
|
||||
runtime·entersyscallblock();
|
||||
runtime·notesleep(&p->wait);
|
||||
runtime·exitsyscall();
|
||||
runtime·notetsleepg(&p->wait, -1);
|
||||
runtime·noteclear(&p->wait);
|
||||
|
||||
n = p->handoff;
|
||||
|
|
|
|||
|
|
@ -159,3 +159,16 @@ runtime·notetsleep(Note *n, int64 ns)
|
|||
runtime·setprof(true);
|
||||
return runtime·atomicload((uint32*)&n->key) != 0;
|
||||
}
|
||||
|
||||
bool
|
||||
runtime·notetsleepg(Note *n, int64 ns)
|
||||
{
|
||||
bool res;
|
||||
|
||||
if(g == m->g0)
|
||||
runtime·throw("notetsleepg on g0");
|
||||
runtime·entersyscallblock();
|
||||
res = runtime·notetsleep(n, ns);
|
||||
runtime·exitsyscall();
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -231,3 +231,16 @@ runtime·notetsleep(Note *n, int64 ns)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
runtime·notetsleepg(Note *n, int64 ns)
|
||||
{
|
||||
bool res;
|
||||
|
||||
if(g == m->g0)
|
||||
runtime·throw("notetsleepg on g0");
|
||||
runtime·entersyscallblock();
|
||||
res = runtime·notetsleep(n, ns);
|
||||
runtime·exitsyscall();
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -460,9 +460,7 @@ runtime·MHeap_Scavenger(void)
|
|||
h = &runtime·mheap;
|
||||
for(k=0;; k++) {
|
||||
runtime·noteclear(¬e);
|
||||
runtime·entersyscallblock();
|
||||
runtime·notetsleep(¬e, tick);
|
||||
runtime·exitsyscall();
|
||||
runtime·notetsleepg(¬e, tick);
|
||||
|
||||
runtime·lock(h);
|
||||
now = runtime·nanotime();
|
||||
|
|
@ -474,9 +472,7 @@ runtime·MHeap_Scavenger(void)
|
|||
runtime·noteclear(¬e);
|
||||
notep = ¬e;
|
||||
runtime·newproc1(&forcegchelperv, (byte*)¬ep, sizeof(notep), 0, runtime·MHeap_Scavenger);
|
||||
runtime·entersyscallblock();
|
||||
runtime·notesleep(¬e);
|
||||
runtime·exitsyscall();
|
||||
runtime·notetsleepg(¬e, -1);
|
||||
if(runtime·debug.gctrace > 0)
|
||||
runtime·printf("scvg%d: GC forced\n", k);
|
||||
runtime·lock(h);
|
||||
|
|
|
|||
|
|
@ -905,11 +905,15 @@ void runtime·unlock(Lock*);
|
|||
* wake up early, it must wait to call noteclear until it
|
||||
* can be sure that no other goroutine is calling
|
||||
* notewakeup.
|
||||
*
|
||||
* notesleep/notetsleep are generally called on g0,
|
||||
* notetsleepg is similar to notetsleep but is called on user g.
|
||||
*/
|
||||
void runtime·noteclear(Note*);
|
||||
void runtime·notesleep(Note*);
|
||||
void runtime·notewakeup(Note*);
|
||||
bool runtime·notetsleep(Note*, int64); // false - timeout
|
||||
bool runtime·notetsleepg(Note*, int64); // false - timeout
|
||||
|
||||
/*
|
||||
* low-level synchronization for implementing the above
|
||||
|
|
|
|||
|
|
@ -106,9 +106,7 @@ func signal_recv() (m uint32) {
|
|||
new = HASWAITER;
|
||||
if(runtime·cas(&sig.state, old, new)) {
|
||||
if (new == HASWAITER) {
|
||||
runtime·entersyscallblock();
|
||||
runtime·notesleep(&sig);
|
||||
runtime·exitsyscall();
|
||||
runtime·notetsleepg(&sig, -1);
|
||||
runtime·noteclear(&sig);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -214,9 +214,7 @@ timerproc(void)
|
|||
timers.sleeping = true;
|
||||
runtime·noteclear(&timers.waitnote);
|
||||
runtime·unlock(&timers);
|
||||
runtime·entersyscallblock();
|
||||
runtime·notetsleep(&timers.waitnote, delta);
|
||||
runtime·exitsyscall();
|
||||
runtime·notetsleepg(&timers.waitnote, delta);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue