Daily bump.
[official-gcc.git] / libgo / go / runtime / norace_test.go
bloba3d5b00860c04b7c03d036899a14af8b9b4d62eb
1 // Copyright 2013 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.
5 // The file contains tests that can not run under race detector for some reason.
6 // +build !race
8 package runtime_test
10 import (
11 "runtime"
12 "sync/atomic"
13 "testing"
16 // Syscall tests split stack between Entersyscall and Exitsyscall under race detector.
17 func BenchmarkSyscall(b *testing.B) {
18 benchmarkSyscall(b, 0, 1)
21 func BenchmarkSyscallWork(b *testing.B) {
22 benchmarkSyscall(b, 100, 1)
25 func BenchmarkSyscallExcess(b *testing.B) {
26 benchmarkSyscall(b, 0, 4)
29 func BenchmarkSyscallExcessWork(b *testing.B) {
30 benchmarkSyscall(b, 100, 4)
33 func benchmarkSyscall(b *testing.B, work, excess int) {
34 const CallsPerSched = 1000
35 procs := runtime.GOMAXPROCS(-1) * excess
36 N := int32(b.N / CallsPerSched)
37 c := make(chan bool, procs)
38 for p := 0; p < procs; p++ {
39 go func() {
40 foo := 42
41 for atomic.AddInt32(&N, -1) >= 0 {
42 runtime.Gosched()
43 for g := 0; g < CallsPerSched; g++ {
44 runtime.Entersyscall()
45 for i := 0; i < work; i++ {
46 foo *= 2
47 foo /= 2
49 runtime.Exitsyscall()
52 c <- foo == 42
53 }()
55 for p := 0; p < procs; p++ {
56 <-c