]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use explicit flag when finalizer goroutine is waiting
authorRuss Cox <rsc@golang.org>
Thu, 8 Apr 2010 03:38:02 +0000 (20:38 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 8 Apr 2010 03:38:02 +0000 (20:38 -0700)
Avoids spurious wakeups during other sleeping by that goroutine.
Fixes #711.

R=r
CC=golang-dev
https://golang.org/cl/902041

src/pkg/runtime/mgc0.c

index 8cde102094005f54b481739bb75c49566b8f1c58..f61c10c60337391db9989c93f6a03e77c5cc68cc 100644 (file)
@@ -25,6 +25,8 @@ extern byte end[];
 
 static G *fing;
 static Finalizer *finq;
+static int32 fingwait;
+
 static void sweepblock(byte*, int64, uint32*, int32);
 static void runfinq(void);
 
@@ -306,8 +308,10 @@ gc(int32 force)
                // kick off or wake up goroutine to run queued finalizers
                if(fing == nil)
                        fing = newproc1((byte*)runfinq, nil, 0, 0);
-               else if(fing->status == Gwaiting)
+               else if(fingwait) {
                        ready(fing);
+                       fingwait = 0;
+               }
        }
        m->locks--;
 
@@ -340,6 +344,7 @@ runfinq(void)
                f = finq;
                finq = nil;
                if(f == nil) {
+                       fingwait = 1;
                        g->status = Gwaiting;
                        gosched();
                        continue;