1
0
mirror of https://github.com/golang/go synced 2024-11-18 16:04:44 -07:00

runtime: fix semacquire->acquireSudog->malloc->gogc->semacquire loop

This is what broke the build at
http://build.golang.org/log/d9c6d334be16cbab85e99fddc6b4ba034319bd4e

LGTM=iant
R=golang-codereviews, iant
CC=dvyukov, golang-codereviews, khr, r
https://golang.org/cl/135580043
This commit is contained in:
Russ Cox 2014-09-07 23:16:12 -04:00
parent 902f8d9ca0
commit 71de7e7539

View File

@ -75,7 +75,19 @@ func acquireSudog() *sudog {
c.sudogcache = s.next
return s
}
return new(sudog)
// Delicate dance: the semaphore implementation calls
// acquireSudog, acquireSudog calls new(sudog),
// new calls malloc, malloc can call the garbage collector,
// and the garbage collector calls the semaphore implementation
// in stoptheworld.
// Break the cycle by doing acquirem/releasem around new(sudog).
// The acquirem/releasem increments m.locks during new(sudog),
// which keeps the garbage collector from being invoked.
mp := acquirem()
p := new(sudog)
releasem(mp)
return p
}
//go:nosplit