mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: don't start new threads from locked threads
Applications that need to manipulate kernel thread state are currently on thin ice in Go: they can use LockOSThread to prevent other goroutines from running on the manipulated thread, but Go may clone this manipulated state into a new thread that's put into the runtime's thread pool along with other threads. Fix this by never starting a new thread from a locked thread or a thread that may have been started by C. Instead, the runtime starts a "template thread" with a known-good state. If it then needs to start a new thread but doesn't know that the current thread is in a good state, it forwards the thread creation to the template thread. Fixes #20676. Change-Id: I798137a56e04b7723d55997e9c5c085d1d910643 Reviewed-on: https://go-review.googlesource.com/46033 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
9a9780a20d
commit
2595fe7fb6
2 changed files with 115 additions and 3 deletions
|
|
@ -533,6 +533,7 @@ type schedt struct {
|
|||
nmidlelocked int32 // number of locked m's waiting for work
|
||||
mcount int32 // number of m's that have been created
|
||||
maxmcount int32 // maximum number of m's allowed (or die)
|
||||
nmsys int32 // number of system m's not counted for deadlock
|
||||
|
||||
ngsys uint32 // number of system goroutines; updated atomically
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue