From a0dbbeae6785ed7fd15feb4feb4975eded83c191 Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Thu, 21 Aug 2014 11:46:53 +0400 Subject: runtime: fix deadlock when gctrace Calling ReadMemStats which does stoptheworld on m0 holding locks was not a good idea. Stoptheworld holding locks is a recipe for deadlocks (added check for this). Stoptheworld on g0 may or may not work (added check for this as well). As far as I understand scavenger will print incorrect numbers now, as stack usage is not subtracted from heap. But it's better than deadlocking. LGTM=khr R=golang-codereviews, rsc, khr CC=golang-codereviews, rlh https://golang.org/cl/124670043 --- src/pkg/runtime/malloc.go | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/pkg/runtime/malloc.go') diff --git a/src/pkg/runtime/malloc.go b/src/pkg/runtime/malloc.go index 8ee460755f..578fbd1c2d 100644 --- a/src/pkg/runtime/malloc.go +++ b/src/pkg/runtime/malloc.go @@ -413,6 +413,7 @@ func gogc(force int32) { return } releasem(mp) + mp = nil if panicking != 0 { return @@ -441,7 +442,11 @@ func gogc(force int32) { startTime := gonanotime() mp = acquirem() mp.gcing = 1 + releasem(mp) stoptheworld() + if mp != acquirem() { + gothrow("gogc: rescheduled") + } clearpools() @@ -474,6 +479,7 @@ func gogc(force int32) { semrelease(&worldsema) starttheworld() releasem(mp) + mp = nil // now that gc is done, kick off finalizer thread if needed if !concurrentSweep { -- cgit v1.3