From: Russ Cox Date: Mon, 8 Sep 2014 03:16:12 +0000 (-0400) Subject: runtime: fix semacquire->acquireSudog->malloc->gogc->semacquire loop X-Git-Tag: go1.4beta1~494 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=71de7e7539a9d139daee6f4467ce73995b37b5a0;p=gostls13.git 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 --- diff --git a/src/pkg/runtime/proc.go b/src/pkg/runtime/proc.go index a9cac266ba..48b8cbe394 100644 --- a/src/pkg/runtime/proc.go +++ b/src/pkg/runtime/proc.go @@ -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