From 6b85fa80519615ae5fd58154277b47d77e5cf08b Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 2 Oct 2019 10:05:46 +0200 Subject: [PATCH] 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 Reviewed-by: Alex Brainman Reviewed-by: Austin Clements TryBot-Result: Gobot Gobot --- src/runtime/os_windows.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index 567c567000..34d0627fcb 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -277,13 +277,11 @@ func monitorSuspendResume() { return // Running on Windows 7, where we don't need it anyway. } var fn interface{} = func(context uintptr, changeType uint32, setting uintptr) uintptr { - lock(&allglock) - for _, gp := range allgs { - if gp.m != nil && gp.m.resumesema != 0 { - stdcall1(_SetEvent, gp.m.resumesema) + for mp := (*m)(atomic.Loadp(unsafe.Pointer(&allm))); mp != nil; mp = mp.alllink { + if mp.resumesema != 0 { + stdcall1(_SetEvent, mp.resumesema) } } - unlock(&allglock) return 0 } params := _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS{ -- 2.50.0