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 6 7package cgotest 8 9/* 10#include <unistd.h> 11#include <stdbool.h> 12#include <sys/syscall.h> 13void Gosched(void); 14static bool Ctid(void) { 15 long tid1 = syscall(SYS_gettid); 16 Gosched(); 17 return tid1 == syscall(SYS_gettid); 18} 19*/ 20import "C" 21 22import ( 23 "runtime" 24 "testing" 25 "time" 26) 27 28//export Gosched 29func Gosched() { 30 runtime.Gosched() 31} 32 33func init() { 34 testThreadLockFunc = testThreadLock 35} 36 37func testThreadLock(t *testing.T) { 38 stop := make(chan int) 39 go func() { 40 // We need the G continue running, 41 // so the M has a chance to run this G. 42 for { 43 select { 44 case <-stop: 45 return 46 case <-time.After(time.Millisecond * 100): 47 } 48 } 49 }() 50 defer close(stop) 51 52 for i := 0; i < 1000; i++ { 53 if !C.Ctid() { 54 t.Fatalf("cgo has not locked OS thread") 55 } 56 } 57} 58