]> Cypherpunks repositories - gostls13.git/commit
runtime: don't spin in checkPut if non-preemptible
authorAustin Clements <austin@google.com>
Mon, 31 Dec 2018 01:04:16 +0000 (20:04 -0500)
committerAustin Clements <austin@google.com>
Wed, 2 Jan 2019 20:21:01 +0000 (20:21 +0000)
commit8e6396115e56d8e0cbecd6904f94c8d893db1724
treef150c8f4c6a9d51e4caa0b5985c8155f1f320ee1
parent5ec5c5741ec7d0e051667f13094f532833d41578
runtime: don't spin in checkPut if non-preemptible

Currently it's possible for the runtime to deadlock if checkPut is
called in a non-preemptible context. In this case, checkPut may spin,
so it won't leave the non-preemptible context, but the thread running
gcMarkDone needs to preempt all of the goroutines before it can
release the checkPut spin loops.

Fix this by returning from checkPut if it's called under any of the
conditions that would prevent gcMarkDone from preempting it. In this
case, it leaves a note behind that this happened; if the runtime does
later detect left-over work it can at least indicate that it was
unable to catch it in the act.

For #27993.
Updates #29385 (may fix it).

Change-Id: Ic71c10701229febb4ddf8c104fb10e06d84b122e
Reviewed-on: https://go-review.googlesource.com/c/156017
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/mgc.go
src/runtime/mgcwork.go