1// Copyright 2012 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
5package race_test
6
7import (
8	"runtime"
9	"sync"
10	"testing"
11	"time"
12)
13
14func 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
29var finVar struct {
30	sync.Mutex
31	cnt int
32}
33
34func 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
53func 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