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:
parent
33a601bf7d
commit
88f89d87c4
@ -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")
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user