github.com/sanprasirt/go@v0.0.0-20170607001320-a027466e4b6d/src/runtime/norace_test.go (about)

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