From 24c58174b27e1cd2cbaa34e392c6a9e7957a6afa Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 7 Apr 2010 20:38:02 -0700 Subject: [PATCH] runtime: use explicit flag when finalizer goroutine is waiting 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c index 8cde102094..f61c10c603 100644 --- a/src/pkg/runtime/mgc0.c +++ b/src/pkg/runtime/mgc0.c @@ -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; -- 2.50.0