From 73a304356bd1edfac204c639859a01643a3f8955 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 12 Feb 2014 15:54:21 -0500 Subject: [PATCH] runtime: fix non-concurrent sweep State of the world: CL 46430043 introduced a new concurrent sweep but is broken. CL 62360043 made the new sweep non-concurrent to try to fix the world while we understand what's wrong with the concurrent version. This CL fixes the non-concurrent form to run finalizers. This CL is just a band-aid to get the build green again. Dmitriy is working on understanding and then fixing what's wrong with the concurrent sweep. TBR=dvyukov CC=golang-codereviews https://golang.org/cl/62370043 --- src/pkg/runtime/mgc0.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c index a6dc1d58ae..012e4dbcaa 100644 --- a/src/pkg/runtime/mgc0.c +++ b/src/pkg/runtime/mgc0.c @@ -66,6 +66,7 @@ enum { CollectStats = 0, ScanStackByFrames = 1, IgnorePreciseGC = 0, + ConcurrentSweep = 0, // Four bits per word (see #defines below). wordsPerBitmapWord = sizeof(void*)*8/4, @@ -2237,6 +2238,23 @@ runtime·gc(int32 force) runtime·semrelease(&runtime·worldsema); runtime·starttheworld(); m->locks--; + + // now that gc is done, kick off finalizer thread if needed + if(!ConcurrentSweep) { + if(finq != nil) { + runtime·lock(&gclock); + // kick off or wake up goroutine to run queued finalizers + if(fing == nil) + fing = runtime·newproc1(&runfinqv, nil, 0, 0, runtime·gc); + else if(fingwait) { + fingwait = 0; + runtime·ready(fing); + } + runtime·unlock(&gclock); + } + // give the queued finalizers, if any, a chance to run + runtime·gosched(); + } } static void @@ -2384,7 +2402,7 @@ gc(struct gc_args *args) sweep.spanidx = 0; // Temporary disable concurrent sweep, because we see failures on builders. - if(false) { + if(ConcurrentSweep) { runtime·lock(&gclock); if(sweep.g == nil) sweep.g = runtime·newproc1(&bgsweepv, nil, 0, 0, runtime·gc);