mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: make LockOSThread/UnlockOSThread nested
Currently, there is a single bit for LockOSThread, so two calls to LockOSThread followed by one call to UnlockOSThread will unlock the thread. There's evidence (#20458) that this is almost never what people want or expect and it makes these APIs very hard to use correctly or reliably. Change this so LockOSThread/UnlockOSThread can be nested and the calling goroutine will not be unwired until UnlockOSThread has been called as many times as LockOSThread has. This should fix the vast majority of incorrect uses while having no effect on the vast majority of correct uses. Fixes #20458. Change-Id: I1464e5e9a0ea4208fbb83638ee9847f929a2bacb Reviewed-on: https://go-review.googlesource.com/45752 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
555c16d8cb
commit
c85b12b579
4 changed files with 68 additions and 27 deletions
|
|
@ -381,3 +381,17 @@ func MapBuckets(m map[int]int) int {
|
|||
h := *(**hmap)(unsafe.Pointer(&m))
|
||||
return 1 << h.B
|
||||
}
|
||||
|
||||
func LockOSCounts() (external, internal uint32) {
|
||||
g := getg()
|
||||
if g.m.lockedExt+g.m.lockedInt == 0 {
|
||||
if g.lockedm != 0 {
|
||||
panic("lockedm on non-locked goroutine")
|
||||
}
|
||||
} else {
|
||||
if g.lockedm == 0 {
|
||||
panic("nil lockedm on locked goroutine")
|
||||
}
|
||||
}
|
||||
return g.m.lockedExt, g.m.lockedInt
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue