blob: e7c3f33c5b5c37825bf8a680423e0a8e3d1a89ec (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package cdata
import (
"runtime"
"sync"
"testing"
)
type refPair struct {
ref1, ref2 uintptr
}
func TestRef(t *testing.T) {
const N = 10
runtime.LockOSThread()
exit := sync.WaitGroup{}
exit.Add(1)
defer exit.Done()
wg := sync.WaitGroup{}
wg.Add(N)
ch := make(chan refPair)
for i := 0; i < N; i++ {
go func() {
runtime.LockOSThread()
wg.Done()
ch <- refPair{Ref(), Ref()}
exit.Wait()
}()
}
wg.Wait()
refs := make(map[uintptr]bool)
for i := 0; i < N; i++ {
pair := <-ch
if pair.ref1 != pair.ref2 {
t.Fatalf("found inconsistent ref: %d != %d", pair.ref1, pair.ref2)
}
if refs[pair.ref1] {
t.Fatalf("found duplicated ref: %d", pair.ref1)
}
refs[pair.ref1] = true
}
}
|