]> Cypherpunks repositories - gostls13.git/commitdiff
undo CL 12167043 / 475e11851fc1
authorDmitriy Vyukov <dvyukov@google.com>
Wed, 31 Jul 2013 16:03:05 +0000 (20:03 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Wed, 31 Jul 2013 16:03:05 +0000 (20:03 +0400)
Submitted with some unrelated changes that were not intended to go in.

««« original CL description
runtime: do not park sysmon thread if any goroutines are running
Sysmon thread parks if no goroutines are running (runtime.sched.npidle == runtime.gomaxprocs).
Currently it's unparked when a goroutine enters syscall, it was enough
to retake P's from blocking syscalls.
But it's not enough for reliable goroutine preemption. We need to ensure that
sysmon runs if any goroutines are running.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/12167043
»»»

R=rsc
CC=golang-dev
https://golang.org/cl/12171044

src/pkg/runtime/proc.c

index f333fdd877b63cf4708c06f090440847068fb731..c4b8c025173b26a3dfdfa3758a8ca4328f336148 100644 (file)
@@ -1536,10 +1536,6 @@ exitsyscallfast(void)
        if(runtime·sched.pidle) {
                runtime·lock(&runtime·sched);
                p = pidleget();
-               if(p && runtime·atomicload(&runtime·sched.sysmonwait)) {
-                       runtime·atomicstore(&runtime·sched.sysmonwait, 0);
-                       runtime·notewakeup(&runtime·sched.sysmonnote);
-               }
                runtime·unlock(&runtime·sched);
                if(p) {
                        acquirep(p);
@@ -1563,10 +1559,6 @@ exitsyscall0(G *gp)
        p = pidleget();
        if(p == nil)
                globrunqput(gp);
-       else if(runtime·atomicload(&runtime·sched.sysmonwait)) {
-               runtime·atomicstore(&runtime·sched.sysmonwait, 0);
-               runtime·notewakeup(&runtime·sched.sysmonnote);
-       }
        runtime·unlock(&runtime·sched);
        if(p) {
                acquirep(p);
@@ -1932,38 +1924,24 @@ static struct {
        uintptr pcbuf[100];
 } prof;
 
-static void
-System(void)
-{
-}
-
 // Called if we receive a SIGPROF signal.
 void
 runtime·sigprof(uint8 *pc, uint8 *sp, uint8 *lr, G *gp)
 {
        int32 n;
-       bool traceback;
 
-       if(prof.fn == nil || prof.hz == 0)
-               return;
-       traceback = true;
        // Windows does profiling in a dedicated thread w/o m.
        if(!Windows && (m == nil || m->mcache == nil))
-               traceback = false;
-       if(gp == m->g0 || gp == m->gsignal)
-               traceback = false;
-       if(m != nil && m->racecall)
-               traceback = false;
+               return;
+       if(prof.fn == nil || prof.hz == 0)
+               return;
 
        runtime·lock(&prof);
        if(prof.fn == nil) {
                runtime·unlock(&prof);
                return;
        }
-       n = 1;
-       prof.pcbuf[0] = (uintptr)pc;
-       if(traceback)
-               n = runtime·gentraceback((uintptr)pc, (uintptr)sp, (uintptr)lr, gp, 0, prof.pcbuf, nelem(prof.pcbuf), nil, nil, false);
+       n = runtime·gentraceback((uintptr)pc, (uintptr)sp, (uintptr)lr, gp, 0, prof.pcbuf, nelem(prof.pcbuf), nil, nil, false);
        if(n > 0)
                prof.fn(prof.pcbuf, n);
        runtime·unlock(&prof);