URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [sync/] [mutex_test.go] - Rev 747
Compare with Previous | Blame | View Log
// Copyright 2009 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.// GOMAXPROCS=10 gotestpackage sync_testimport ("runtime". "sync""sync/atomic""testing")func HammerSemaphore(s *uint32, loops int, cdone chan bool) {for i := 0; i < loops; i++ {runtime.Semacquire(s)runtime.Semrelease(s)}cdone <- true}func TestSemaphore(t *testing.T) {s := new(uint32)*s = 1c := make(chan bool)for i := 0; i < 10; i++ {go HammerSemaphore(s, 1000, c)}for i := 0; i < 10; i++ {<-c}}func BenchmarkUncontendedSemaphore(b *testing.B) {s := new(uint32)*s = 1HammerSemaphore(s, b.N, make(chan bool, 2))}func BenchmarkContendedSemaphore(b *testing.B) {b.StopTimer()s := new(uint32)*s = 1c := make(chan bool)defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))b.StartTimer()go HammerSemaphore(s, b.N/2, c)go HammerSemaphore(s, b.N/2, c)<-c<-c}func HammerMutex(m *Mutex, loops int, cdone chan bool) {for i := 0; i < loops; i++ {m.Lock()m.Unlock()}cdone <- true}func TestMutex(t *testing.T) {m := new(Mutex)c := make(chan bool)for i := 0; i < 10; i++ {go HammerMutex(m, 1000, c)}for i := 0; i < 10; i++ {<-c}}func TestMutexPanic(t *testing.T) {defer func() {if recover() == nil {t.Fatalf("unlock of unlocked mutex did not panic")}}()var mu Mutexmu.Lock()mu.Unlock()mu.Unlock()}func BenchmarkMutexUncontended(b *testing.B) {type PaddedMutex struct {Mutexpad [128]uint8}const CallsPerSched = 1000procs := runtime.GOMAXPROCS(-1)N := int32(b.N / CallsPerSched)c := make(chan bool, procs)for p := 0; p < procs; p++ {go func() {var mu PaddedMutexfor atomic.AddInt32(&N, -1) >= 0 {runtime.Gosched()for g := 0; g < CallsPerSched; g++ {mu.Lock()mu.Unlock()}}c <- true}()}for p := 0; p < procs; p++ {<-c}}func benchmarkMutex(b *testing.B, slack, work bool) {const (CallsPerSched = 1000LocalWork = 100GoroutineSlack = 10)procs := runtime.GOMAXPROCS(-1)if slack {procs *= GoroutineSlack}N := int32(b.N / CallsPerSched)c := make(chan bool, procs)var mu Mutexfor p := 0; p < procs; p++ {go func() {foo := 0for atomic.AddInt32(&N, -1) >= 0 {runtime.Gosched()for g := 0; g < CallsPerSched; g++ {mu.Lock()mu.Unlock()if work {for i := 0; i < LocalWork; i++ {foo *= 2foo /= 2}}}}c <- foo == 42}()}for p := 0; p < procs; p++ {<-c}}func BenchmarkMutex(b *testing.B) {benchmarkMutex(b, false, false)}func BenchmarkMutexSlack(b *testing.B) {benchmarkMutex(b, true, false)}func BenchmarkMutexWork(b *testing.B) {benchmarkMutex(b, false, true)}func BenchmarkMutexWorkSlack(b *testing.B) {benchmarkMutex(b, true, true)}
