From: Austin Clements Date: Thu, 18 May 2023 15:19:54 +0000 (-0400) Subject: cmd/cgo/internal/test: fix TestThreadLock X-Git-Tag: go1.21rc1~461 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=88f89d87c4e818679b65cfc50a7b0cb554e154d3;p=gostls13.git cmd/cgo/internal/test: fix TestThreadLock This test was introduced in CL 18882, but only recently enabled as of CL 493603. It's intended to check that we don't move executing C code between threads when it re-enters Go, but it has always contained a flake. Go *can* preempt between the Go call to gettid and the C call to gettid and move the goroutine to another thread because there's no C code on the stack during the Go call to gettid. This will cause the test to fail. Fix this by making both gettid calls in C, with a re-entry to Go between them. Fixes #60265 Change-Id: I546621a541ce52b996d68b17d3bed709d2b5b1f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/496182 Auto-Submit: Austin Clements TryBot-Result: Gopher Robot Reviewed-by: Michael Knyszek Reviewed-by: Bryan Mills Run-TryBot: Austin Clements --- diff --git a/src/cmd/cgo/internal/test/cgo_thread_lock.go b/src/cmd/cgo/internal/test/cgo_thread_lock.go index 981830b6b9..e8749384af 100644 --- a/src/cmd/cgo/internal/test/cgo_thread_lock.go +++ b/src/cmd/cgo/internal/test/cgo_thread_lock.go @@ -8,15 +8,19 @@ package cgotest /* #include +#include #include void Gosched(void); -static int Ctid(void) { Gosched(); return syscall(SYS_gettid); } +static bool Ctid(void) { + long tid1 = syscall(SYS_gettid); + Gosched(); + return tid1 == syscall(SYS_gettid); +} */ import "C" import ( "runtime" - "syscall" "testing" "time" ) @@ -46,7 +50,7 @@ func testThreadLock(t *testing.T) { defer close(stop) for i := 0; i < 1000; i++ { - if C.int(syscall.Gettid()) != C.Ctid() { + if !C.Ctid() { t.Fatalf("cgo has not locked OS thread") } }