1
2
3
4
5 package race_test
6
7 import (
8 "runtime"
9 "sync"
10 "testing"
11 "time"
12 )
13
14 func TestNoRaceFin(t *testing.T) {
15 c := make(chan bool)
16 go func() {
17 x := new(string)
18 runtime.SetFinalizer(x, func(x *string) {
19 *x = "foo"
20 })
21 *x = "bar"
22 c <- true
23 }()
24 <-c
25 runtime.GC()
26 time.Sleep(100 * time.Millisecond)
27 }
28
29 var finVar struct {
30 sync.Mutex
31 cnt int
32 }
33
34 func TestNoRaceFinGlobal(t *testing.T) {
35 c := make(chan bool)
36 go func() {
37 x := new(string)
38 runtime.SetFinalizer(x, func(x *string) {
39 finVar.Lock()
40 finVar.cnt++
41 finVar.Unlock()
42 })
43 c <- true
44 }()
45 <-c
46 runtime.GC()
47 time.Sleep(100 * time.Millisecond)
48 finVar.Lock()
49 finVar.cnt++
50 finVar.Unlock()
51 }
52
53 func TestRaceFin(t *testing.T) {
54 c := make(chan bool)
55 y := 0
56 _ = y
57 go func() {
58 x := new(string)
59 runtime.SetFinalizer(x, func(x *string) {
60 y = 42
61 })
62 c <- true
63 }()
64 <-c
65 runtime.GC()
66 time.Sleep(100 * time.Millisecond)
67 y = 66
68 }
69
View as plain text