]> Cypherpunks repositories - gostls13.git/commitdiff
get rid of per-G Note, avoids per-G kernel semaphore on Mac.
authorRuss Cox <rsc@golang.org>
Wed, 24 Sep 2008 21:13:07 +0000 (14:13 -0700)
committerRuss Cox <rsc@golang.org>
Wed, 24 Sep 2008 21:13:07 +0000 (14:13 -0700)
2.14u 19.82s 22.17r   6.out 100000 # old
1.87u 0.43s 2.31r   6.out 100000 # new

R=r
OCL=15762
CL=15772

src/runtime/proc.c
src/runtime/runtime.h

index 84f5a06ed66567ab5c53808f9e3400d213ed1bd3..4fdcd4ec29322b8d37f53f20028791a36555647c 100644 (file)
@@ -285,24 +285,25 @@ gfget(void)
 void
 ready(G *g)
 {
-       // Wait for g to stop running (for example, it migh
-       // have queued itself on a channel but not yet gotten
-       // a chance to call sys·gosched and actually go to sleep).
-       notesleep(&g->stopped);
-
        lock(&sched);
        readylocked(g);
        unlock(&sched);
 }
 
-// Mark g ready to run.  Sched is already locked,
-// and g is known not to be running right now
-// (i.e., ready has slept on g->stopped or the g was
-// just allocated in sys·newproc).
+// Mark g ready to run.  Sched is already locked.
+// G might be running already and about to stop.
+// The sched lock protects g->status from changing underfoot.
 static void
 readylocked(G *g)
 {
        M *m;
+       
+       if(g->m){
+               // Running on another machine.
+               // Ready it when it stops.
+               g->readyonstop = 1;
+               return;
+       }
 
        // Mark runnable.
        if(g->status == Grunnable || g->status == Grunning)
@@ -382,7 +383,7 @@ scheduler(void)
 
                // Just finished running m->curg.
                gp = m->curg;
-               gp->m = nil;    // for debugger
+               gp->m = nil;
                switch(gp->status){
                case Grunnable:
                case Gdead:
@@ -398,15 +399,18 @@ scheduler(void)
                                sys·exit(0);
                        break;
                }
-               notewakeup(&gp->stopped);
+               if(gp->readyonstop){
+                       gp->readyonstop = 0;
+                       readylocked(gp);
+               }
        }
 
        // Find (or wait for) g to run.  Unlocks sched.
        gp = nextgandunlock();
-       noteclear(&gp->stopped);
+       gp->readyonstop = 0;
        gp->status = Grunning;
        m->curg = gp;
-       gp->m = m;      // for debugger
+       gp->m = m;
        g = gp;
        gogo(&gp->sched);
 }
index 411b6046bfa4f32c67cb67f057824a56f751455c..86afaaa7c21e63e11ed644ddeeae06c9ed18e45a 100644 (file)
@@ -123,7 +123,7 @@ struct      G
        int32   goid;
        int32   selgen;         // valid sudog pointer
        G*      schedlink;
-       Note    stopped;
+       bool            readyonstop;
        M*      m;      // for debuggers
 };
 struct Mem