From ec972f2878a9c97720ea44ddecf9974e0e691ec8 Mon Sep 17 00:00:00 2001 From: Mauri de Souza Meneguzzo Date: Mon, 11 Dec 2023 14:16:02 -0300 Subject: [PATCH] iter: fix race instrumentation in Pull2 Pull2 tests are failing with -race, giving false-positive race conditions due to bad race instrumentation. No tests for this as it should be caught by the race builders. The only reason it was not caught is because it is behind GOEXPERIMENT=rangefunc. Fixes [reserved] --- src/iter/iter.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/iter/iter.go b/src/iter/iter.go index 240df00f7f..e89a838ac4 100644 --- a/src/iter/iter.go +++ b/src/iter/iter.go @@ -122,18 +122,22 @@ func Pull[V any](seq Seq[V]) (next func() (V, bool), stop func()) { // simultaneously. func Pull2[K, V any](seq Seq2[K, V]) (next func() (K, V, bool), stop func()) { var ( - k K - v V - ok bool - done bool + k K + v V + ok bool + done bool + racer int ) c := newcoro(func(c *coro) { + race.Acquire(unsafe.Pointer(&racer)) yield := func(k1 K, v1 V) bool { if done { return false } k, v, ok = k1, v1, true + race.Release(unsafe.Pointer(&racer)) coroswitch(c) + race.Acquire(unsafe.Pointer(&racer)) return !done } seq(yield) @@ -141,20 +145,25 @@ func Pull2[K, V any](seq Seq2[K, V]) (next func() (K, V, bool), stop func()) { var v0 V k, v, ok = k0, v0, false done = true + race.Release(unsafe.Pointer(&racer)) }) next = func() (k1 K, v1 V, ok1 bool) { - race.Write(unsafe.Pointer(&c)) // detect races + race.Write(unsafe.Pointer(&racer)) // detect races if done { return } + race.Release(unsafe.Pointer(&racer)) coroswitch(c) + race.Acquire(unsafe.Pointer(&racer)) return k, v, ok } stop = func() { - race.Write(unsafe.Pointer(&c)) // detect races + race.Write(unsafe.Pointer(&racer)) // detect races if !done { done = true + race.Release(unsafe.Pointer(&racer)) coroswitch(c) + race.Acquire(unsafe.Pointer(&racer)) } } return next, stop