1
0
mirror of https://github.com/golang/go synced 2024-10-02 14:28:38 -06:00

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
This commit is contained in:
Russ Cox 2014-02-12 15:54:21 -05:00
parent b2cac62f9b
commit 73a304356b

View File

@ -66,6 +66,7 @@ enum {
CollectStats = 0, CollectStats = 0,
ScanStackByFrames = 1, ScanStackByFrames = 1,
IgnorePreciseGC = 0, IgnorePreciseGC = 0,
ConcurrentSweep = 0,
// Four bits per word (see #defines below). // Four bits per word (see #defines below).
wordsPerBitmapWord = sizeof(void*)*8/4, wordsPerBitmapWord = sizeof(void*)*8/4,
@ -2237,6 +2238,23 @@ runtime·gc(int32 force)
runtime·semrelease(&runtime·worldsema); runtime·semrelease(&runtime·worldsema);
runtime·starttheworld(); runtime·starttheworld();
m->locks--; 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 static void
@ -2384,7 +2402,7 @@ gc(struct gc_args *args)
sweep.spanidx = 0; sweep.spanidx = 0;
// Temporary disable concurrent sweep, because we see failures on builders. // Temporary disable concurrent sweep, because we see failures on builders.
if(false) { if(ConcurrentSweep) {
runtime·lock(&gclock); runtime·lock(&gclock);
if(sweep.g == nil) if(sweep.g == nil)
sweep.g = runtime·newproc1(&bgsweepv, nil, 0, 0, runtime·gc); sweep.g = runtime·newproc1(&bgsweepv, nil, 0, 0, runtime·gc);