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.
4
5// The file contains tests that cannot run under race detector for some reason.
6// +build !race
7
8package runtime_test
9
10import (
11	"runtime"
12	"testing"
13)
14
15// Syscall tests split stack between Entersyscall and Exitsyscall under race detector.
16func BenchmarkSyscall(b *testing.B) {
17	benchmarkSyscall(b, 0, 1)
18}
19
20func BenchmarkSyscallWork(b *testing.B) {
21	benchmarkSyscall(b, 100, 1)
22}
23
24func BenchmarkSyscallExcess(b *testing.B) {
25	benchmarkSyscall(b, 0, 4)
26}
27
28func BenchmarkSyscallExcessWork(b *testing.B) {
29	benchmarkSyscall(b, 100, 4)
30}
31
32func benchmarkSyscall(b *testing.B, work, excess int) {
33	b.SetParallelism(excess)
34	b.RunParallel(func(pb *testing.PB) {
35		foo := 42
36		for pb.Next() {
37			runtime.Entersyscall()
38			for i := 0; i < work; i++ {
39				foo *= 2
40				foo /= 2
41			}
42			runtime.Exitsyscall()
43		}
44		_ = foo
45	})
46}
47