github.com/golang/gofrontend@v0.0.0-20240429183944-60f985a78526/libgo/misc/cgo/test/cgo_thread_lock.go (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build linux && freebsd && openbsd 6 // +build linux,freebsd,openbsd 7 8 package cgotest 9 10 /* 11 #include <unistd.h> 12 #include <sys/syscall.h> 13 void Gosched(void); 14 static int Ctid(void) { Gosched(); return syscall(SYS_gettid); } 15 */ 16 import "C" 17 18 import ( 19 "runtime" 20 "syscall" 21 "testing" 22 "time" 23 ) 24 25 //export Gosched 26 func Gosched() { 27 runtime.Gosched() 28 } 29 30 func init() { 31 testThreadLockFunc = testThreadLock 32 } 33 34 func testThreadLock(t *testing.T) { 35 stop := make(chan int) 36 go func() { 37 // We need the G continue running, 38 // so the M has a chance to run this G. 39 for { 40 select { 41 case <-stop: 42 return 43 case <-time.After(time.Millisecond * 100): 44 } 45 } 46 }() 47 defer close(stop) 48 49 for i := 0; i < 1000; i++ { 50 if C.int(syscall.Gettid()) != C.Ctid() { 51 t.Fatalf("cgo has not locked OS thread") 52 } 53 } 54 }