1
0
mirror of https://github.com/golang/go synced 2024-11-11 21:20:21 -07:00

misc/cgo/test: add test that gccgo fails

Gccgo isn't locking the OS thread properly during calls.

Change-Id: Idb2475291405e390cbb83abb27a402fd0381d0c4
Reviewed-on: https://go-review.googlesource.com/18882
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
Xia Bin 2016-01-24 14:22:54 +08:00 committed by Russ Cox
parent 90a750857c
commit 347259cbae
3 changed files with 57 additions and 0 deletions

View File

@ -162,3 +162,6 @@ func testUnsignedInt(t *testing.T) {
func sliceOperands(array [2000]int) { func sliceOperands(array [2000]int) {
_ = array[C.KILO:C.KILO:C.KILO] // no type error _ = array[C.KILO:C.KILO:C.KILO] // no type error
} }
// set in cgo_thread_lock.go init
var testThreadLockFunc = func(*testing.T) {}

View File

@ -72,5 +72,6 @@ func TestCallGoWithString(t *testing.T) { testCallGoWithString(t) }
func Test14838(t *testing.T) { test14838(t) } func Test14838(t *testing.T) { test14838(t) }
func Test8756(t *testing.T) { test8756(t) } func Test8756(t *testing.T) { test8756(t) }
func Test17065(t *testing.T) { test17065(t) } func Test17065(t *testing.T) { test17065(t) }
func TestThreadLock(t *testing.T) { testThreadLockFunc(t) }
func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) } func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }

View File

@ -0,0 +1,53 @@
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build linux,freebsd,openbsd
package cgotest
/*
#include <unistd.h>
#include <sys/syscall.h>
void Gosched(void);
static int Ctid(void) { Gosched(); return syscall(SYS_gettid); }
*/
import "C"
import (
"runtime"
"syscall"
"testing"
"time"
)
//export Gosched
func Gosched() {
runtime.Gosched()
}
func init() {
testThreadLockFunc = testThreadLock
}
func testThreadLock(t *testing.T) {
stop := make(chan int)
go func() {
// We need the G continue running,
// so the M has a chance to run this G.
for {
select {
case <-stop:
return
case <-time.After(time.Millisecond * 100):
}
}
}()
defer close(stop)
for i := 0; i < 1000; i++ {
if C.int(syscall.Gettid()) != C.Ctid() {
t.Fatalf("cgo has not locked OS thread")
}
}
}