]> Cypherpunks repositories - gostls13.git/commitdiff
use Note sched.stopped correctly
authorRuss Cox <rsc@golang.org>
Tue, 9 Dec 2008 01:14:08 +0000 (17:14 -0800)
committerRuss Cox <rsc@golang.org>
Tue, 9 Dec 2008 01:14:08 +0000 (17:14 -0800)
R=r
DELTA=6  (5 added, 0 deleted, 1 changed)
OCL=20777
CL=20779

src/runtime/proc.c

index 6e947c5f504818b139a9568430516579e7578c1b..68d06788e4b35c97ff7d39595f33e7312ef36faf 100644 (file)
@@ -59,6 +59,7 @@ struct Sched {
        int32 predawn;  // running initialization, don't run new gs.
 
        Note    stopped;        // one g can wait here for ms to stop
+       int32 waitstop; // after setting this flag
 };
 
 Sched sched;
@@ -352,7 +353,10 @@ nextgandunlock(void)
                throw("all goroutines are asleep - deadlock!");
        m->nextg = nil;
        noteclear(&m->havenextg);
-       notewakeup(&sched.stopped);
+       if(sched.waitstop) {
+               sched.waitstop = 0;
+               notewakeup(&sched.stopped);
+       }
        unlock(&sched);
 
        notesleep(&m->havenextg);
@@ -376,6 +380,7 @@ stoptheworld(void)
        sched.mcpumax = 1;
        while(sched.mcpu > 1) {
                noteclear(&sched.stopped);
+               sched.waitstop = 1;
                unlock(&sched);
                notesleep(&sched.stopped);
                lock(&sched);