From 3313bbb4055f38f53cd43c6c5782a229f445f230 Mon Sep 17 00:00:00 2001 From: David Chase Date: Thu, 14 Dec 2023 14:20:12 -0500 Subject: runtime: add race annotations in IncNonDefault Also use CompareAndSwap to make the code actually less racy. Added a test which will be meaningful when run under the race detector (tested it -race with broken fix in runtime, it failed). Fixes #64649 Change-Id: I5972e08901d1adc8ba74858edad7eba91be1b0ce Reviewed-on: https://go-review.googlesource.com/c/go/+/549796 Run-TryBot: David Chase Reviewed-by: Mauri de Souza Meneguzzo Reviewed-by: Cherry Mui TryBot-Result: Gopher Robot --- src/runtime/runtime.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/runtime/runtime.go') diff --git a/src/runtime/runtime.go b/src/runtime/runtime.go index 0829a84e43..92cdfc310e 100644 --- a/src/runtime/runtime.go +++ b/src/runtime/runtime.go @@ -172,7 +172,15 @@ func (g *godebugInc) IncNonDefault() { // *godebug.Setting. inc = new(func()) *inc = (*newInc)(g.name) - g.inc.Store(inc) + if raceenabled { + racerelease(unsafe.Pointer(&g.inc)) + } + if !g.inc.CompareAndSwap(nil, inc) { + inc = g.inc.Load() + } + } + if raceenabled { + raceacquire(unsafe.Pointer(&g.inc)) } (*inc)() } -- cgit v1.3-6-g1900