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