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:
parent
902f8d9ca0
commit
71de7e7539
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user