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 <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Austin Clements <austin@google.com>
This commit is contained in:
Austin Clements 2023-05-18 16:26:13 -04:00
parent 3ebbaf3a4d
commit b42ce3a65f
3 changed files with 35 additions and 9 deletions

View File

@ -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 <stddef.h>
//go:build cgo && unix && !darwin
#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
#include <pthread.h>
// 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

View File

@ -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 <pthread.h>
// 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()

View File

@ -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")
}