diff --git a/src/runtime/abi_test.go b/src/runtime/abi_test.go index f50ed879d4..b82acfe325 100644 --- a/src/runtime/abi_test.go +++ b/src/runtime/abi_test.go @@ -17,21 +17,36 @@ import ( "os/exec" "runtime" "strings" + "sync" "testing" "time" ) -var regConfirmRun int +var regConfirmRunIface int +var regConfirmRunPtr int +var regConfirmMU sync.Mutex + +func guardedRead(p *int) int { + regConfirmMU.Lock() + defer regConfirmMU.Unlock() + return *p +} + +func guardedWrite(p *int, v int) { + regConfirmMU.Lock() + defer regConfirmMU.Unlock() + *p = v +} //go:registerparams func regFinalizerPointer(v *Tint) (int, float32, [10]byte) { - regConfirmRun = *(*int)(v) + guardedWrite(®ConfirmRunPtr, *(*int)(v)) return 5151, 4.0, [10]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} } //go:registerparams func regFinalizerIface(v Tinter) (int, float32, [10]byte) { - regConfirmRun = *(*int)(v.(*Tint)) + guardedWrite(®ConfirmRunIface, *(*int)(v.(*Tint))) return 5151, 4.0, [10]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} } @@ -81,14 +96,15 @@ func TestFinalizerRegisterABI(t *testing.T) { name string fin interface{} confirmValue int + confirmRun *int }{ - {"Pointer", regFinalizerPointer, -1}, - {"Interface", regFinalizerIface, -2}, + {"Pointer", regFinalizerPointer, -1, ®ConfirmRunPtr}, + {"Interface", regFinalizerIface, -2, ®ConfirmRunIface}, } for i := range tests { test := &tests[i] t.Run(test.name, func(t *testing.T) { - regConfirmRun = 0 + guardedWrite(test.confirmRun, 0) x := new(Tint) *x = (Tint)(test.confirmValue) @@ -102,14 +118,15 @@ func TestFinalizerRegisterABI(t *testing.T) { for i := 0; i < 100; i++ { time.Sleep(10 * time.Millisecond) - if regConfirmRun != 0 { + if guardedRead(test.confirmRun) != 0 { break } } - if regConfirmRun == 0 { + v := guardedRead(test.confirmRun) + if v == 0 { t.Fatal("finalizer failed to execute") - } else if regConfirmRun != test.confirmValue { - t.Fatalf("wrong finalizer executed? regConfirmRun = %d", regConfirmRun) + } else if v != test.confirmValue { + t.Fatalf("wrong finalizer executed? regConfirmRun = %d", v) } }) }