// 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)
{
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
// 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"
)
func testTLS(t *testing.T) {
+ if skip := C.checkTLS(); skip != nil {
+ t.Skipf("%s", C.GoString(skip))
+ }
+
runtime.LockOSThread()
defer runtime.UnlockOSThread()
// 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")
}