URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [sync/] [once_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.package sync_testimport ("runtime". "sync""sync/atomic""testing")type one intfunc (o *one) Increment() {*o++}func run(once *Once, o *one, c chan bool) {once.Do(func() { o.Increment() })c <- true}func TestOnce(t *testing.T) {o := new(one)once := new(Once)c := make(chan bool)const N = 10for i := 0; i < N; i++ {go run(once, o, c)}for i := 0; i < N; i++ {<-c}if *o != 1 {t.Errorf("once failed: %d is not 1", *o)}}func BenchmarkOnce(b *testing.B) {const CallsPerSched = 1000procs := runtime.GOMAXPROCS(-1)N := int32(b.N / CallsPerSched)var once Oncef := func() {}c := make(chan bool, procs)for p := 0; p < procs; p++ {go func() {for atomic.AddInt32(&N, -1) >= 0 {runtime.Gosched()for g := 0; g < CallsPerSched; g++ {once.Do(f)}}c <- true}()}for p := 0; p < procs; p++ {<-c}}
