1
0
mirror of https://github.com/golang/go synced 2024-11-16 22:04:50 -07:00

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 <austin@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Austin Clements <austin@google.com>
This commit is contained in:
Austin Clements 2023-05-18 11:19:54 -04:00 committed by Gopher Robot
parent 33a601bf7d
commit 88f89d87c4

View File

@ -8,15 +8,19 @@ package cgotest
/*
#include <unistd.h>
#include <stdbool.h>
#include <sys/syscall.h>
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")
}
}