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