mirror of https://github.com/golang/go.git
runtime: iterate ms via allm linked list to avoid race
It's pointless to reach all ms via allgs, and doing so introduces a race, since the m member of a g can change underneath it. Instead iterate directly through the allm linked list. Updates: #31528 Updates: #34130 Change-Id: I34b88402b44339b0a5b4cd76eafd0ce6e43e2be1 Reviewed-on: https://go-review.googlesource.com/c/go/+/198417 Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com> Reviewed-by: Alex Brainman <alex.brainman@gmail.com> Reviewed-by: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
9e6a84f2b1
commit
6b85fa8051
|
|
@ -277,13 +277,11 @@ func monitorSuspendResume() {
|
||||||
return // Running on Windows 7, where we don't need it anyway.
|
return // Running on Windows 7, where we don't need it anyway.
|
||||||
}
|
}
|
||||||
var fn interface{} = func(context uintptr, changeType uint32, setting uintptr) uintptr {
|
var fn interface{} = func(context uintptr, changeType uint32, setting uintptr) uintptr {
|
||||||
lock(&allglock)
|
for mp := (*m)(atomic.Loadp(unsafe.Pointer(&allm))); mp != nil; mp = mp.alllink {
|
||||||
for _, gp := range allgs {
|
if mp.resumesema != 0 {
|
||||||
if gp.m != nil && gp.m.resumesema != 0 {
|
stdcall1(_SetEvent, mp.resumesema)
|
||||||
stdcall1(_SetEvent, gp.m.resumesema)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unlock(&allglock)
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
params := _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS{
|
params := _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue