|  | // Copyright 2013 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. | 
|  |  | 
|  | // The file contains tests that cannot run under race detector for some reason. | 
|  | // | 
|  | //go:build !race | 
|  |  | 
|  | package runtime_test | 
|  |  | 
|  | import ( | 
|  | "runtime" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | // Syscall tests split stack between Entersyscall and Exitsyscall under race detector. | 
|  | func BenchmarkSyscall(b *testing.B) { | 
|  | benchmarkSyscall(b, 0, 1) | 
|  | } | 
|  |  | 
|  | func BenchmarkSyscallWork(b *testing.B) { | 
|  | benchmarkSyscall(b, 100, 1) | 
|  | } | 
|  |  | 
|  | func BenchmarkSyscallExcess(b *testing.B) { | 
|  | benchmarkSyscall(b, 0, 4) | 
|  | } | 
|  |  | 
|  | func BenchmarkSyscallExcessWork(b *testing.B) { | 
|  | benchmarkSyscall(b, 100, 4) | 
|  | } | 
|  |  | 
|  | func benchmarkSyscall(b *testing.B, work, excess int) { | 
|  | b.SetParallelism(excess) | 
|  | b.RunParallel(func(pb *testing.PB) { | 
|  | foo := 42 | 
|  | for pb.Next() { | 
|  | runtime.Entersyscall() | 
|  | for i := 0; i < work; i++ { | 
|  | foo *= 2 | 
|  | foo /= 2 | 
|  | } | 
|  | runtime.Exitsyscall() | 
|  | } | 
|  | _ = foo | 
|  | }) | 
|  | } |