mirror of
https://github.com/golang/go
synced 2024-11-19 18:54:41 -07: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:
parent
b2cac62f9b
commit
73a304356b
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user