From b42ce3a65fd0ea323a67bc8bdbb2a88e7148dcc7 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 18 May 2023 16:26:13 -0400 Subject: [PATCH] cmd/cgo/internal/testtls: cleanup and support more arches Currently, this test only enabled on non-Darwin UNIX platforms because it uses the non-standard _thread attribute for thread-local storage. C11 introduced a standard way to declare something thread-local, so this CL takes advantage of that to generalize the test to Darwin and Windows. Change-Id: Iba31b6216721df6eb8e978d7487cd3a787cae588 Reviewed-on: https://go-review.googlesource.com/c/go/+/496295 Reviewed-by: Bryan Mills TryBot-Result: Gopher Robot Run-TryBot: Austin Clements --- src/cmd/cgo/internal/testtls/tls.c | 32 +++++++++++++++++++++--- src/cmd/cgo/internal/testtls/tls.go | 8 +++--- src/cmd/cgo/internal/testtls/tls_none.go | 4 +-- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/cmd/cgo/internal/testtls/tls.c b/src/cmd/cgo/internal/testtls/tls.c index 0e2bbee542..8839cc8676 100644 --- a/src/cmd/cgo/internal/testtls/tls.c +++ b/src/cmd/cgo/internal/testtls/tls.c @@ -2,13 +2,18 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Darwin does not have __thread. +#include -//go:build cgo && unix && !darwin +#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) -#include +// Mingw seems not to have threads.h, so we use the _Thread_local keyword rather +// than the thread_local macro. +static _Thread_local int tls; -static __thread int tls; +const char * +checkTLS() { + return NULL; +} void setTLS(int v) @@ -21,3 +26,22 @@ getTLS() { return tls; } + +#else + +const char * +checkTLS() { + return "_Thread_local requires C11 and not __STDC_NO_THREADS__"; +} + +void +setTLS(int v) { +} + +int +getTLS() +{ + return 0; +} + +#endif diff --git a/src/cmd/cgo/internal/testtls/tls.go b/src/cmd/cgo/internal/testtls/tls.go index eb59ad41eb..78628f5caa 100644 --- a/src/cmd/cgo/internal/testtls/tls.go +++ b/src/cmd/cgo/internal/testtls/tls.go @@ -2,11 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build cgo && unix && !darwin - package cgotlstest -// #include +// extern const char *checkTLS(); // extern void setTLS(int); // extern int getTLS(); import "C" @@ -17,6 +15,10 @@ import ( ) func testTLS(t *testing.T) { + if skip := C.checkTLS(); skip != nil { + t.Skipf("%s", C.GoString(skip)) + } + runtime.LockOSThread() defer runtime.UnlockOSThread() diff --git a/src/cmd/cgo/internal/testtls/tls_none.go b/src/cmd/cgo/internal/testtls/tls_none.go index 81c9c5e23d..b6033fb76d 100644 --- a/src/cmd/cgo/internal/testtls/tls_none.go +++ b/src/cmd/cgo/internal/testtls/tls_none.go @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !(cgo && unix && !darwin) +//go:build !cgo package cgotlstest import "testing" func testTLS(t *testing.T) { - t.Skip("__thread is not supported") + t.Skip("cgo not supported") } -- 2.48.1