Skip to content

Commit 7b767f4

Browse files
committed
internal/race: add package
Factor out duplicated race thunks from sync, syscall net and fmt packages into a separate package and use it. Fixes #8593 Change-Id: I156869c50946277809f6b509463752e7f7d28cdb Reviewed-on: https://go-review.googlesource.com/14870 Reviewed-by: Brad Fitzpatrick <[email protected]> Run-TryBot: Dmitry Vyukov <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent e9081b3 commit 7b767f4

24 files changed

+239
-334
lines changed

src/cmd/dist/deps.go

Lines changed: 42 additions & 41 deletions
Large diffs are not rendered by default.

src/fmt/fmt_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package fmt_test
77
import (
88
"bytes"
99
. "fmt"
10+
"internal/race"
1011
"io"
1112
"math"
1213
"reflect"
@@ -982,7 +983,7 @@ func TestCountMallocs(t *testing.T) {
982983
t.Skip("skipping malloc count in short mode")
983984
case runtime.GOMAXPROCS(0) > 1:
984985
t.Skip("skipping; GOMAXPROCS>1")
985-
case raceenabled:
986+
case race.Enabled:
986987
t.Skip("skipping malloc count under race detector")
987988
}
988989
for _, mt := range mallocTest {

src/fmt/norace_test.go

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/fmt/race_test.go

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/go/build/deps_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ var pkgDeps = map[string][]string{
3939
"runtime": {"unsafe", "runtime/internal/atomic", "runtime/internal/sys"},
4040
"runtime/internal/sys": {},
4141
"runtime/internal/atomic": {"unsafe", "runtime/internal/sys"},
42-
"sync": {"runtime", "sync/atomic", "unsafe"},
43-
"sync/atomic": {"unsafe"},
44-
"unsafe": {},
42+
"internal/race": {"runtime", "unsafe"},
43+
"sync": {"internal/race", "runtime", "sync/atomic", "unsafe"},
44+
"sync/atomic": {"unsafe"},
45+
"unsafe": {},
4546

4647
"L0": {
4748
"errors",
@@ -131,7 +132,7 @@ var pkgDeps = map[string][]string{
131132
// End of linear dependency definitions.
132133

133134
// Operating system access.
134-
"syscall": {"L0", "unicode/utf16"},
135+
"syscall": {"L0", "internal/race", "unicode/utf16"},
135136
"internal/syscall/unix": {"L0", "syscall"},
136137
"internal/syscall/windows": {"L0", "syscall"},
137138
"internal/syscall/windows/registry": {"L0", "syscall", "unicode/utf16"},
@@ -278,7 +279,7 @@ var pkgDeps = map[string][]string{
278279
// Basic networking.
279280
// Because net must be used by any package that wants to
280281
// do networking portably, it must have a small dependency set: just L0+basic os.
281-
"net": {"L0", "CGO", "math/rand", "os", "sort", "syscall", "time", "internal/syscall/windows", "internal/singleflight"},
282+
"net": {"L0", "CGO", "math/rand", "os", "sort", "syscall", "time", "internal/syscall/windows", "internal/singleflight", "internal/race"},
282283

283284
// NET enables use of basic network-related packages.
284285
"NET": {

src/internal/race/doc.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright 2015 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+
5+
/*
6+
Package race contains helper functions for manually instrumenting code for the race detector.
7+
8+
The runtime package intentionally exports these functions only in the race build;
9+
this package exports them unconditionally but without the "race" build tag they are no-ops.
10+
*/
11+
package race

src/internal/race/norace.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2015 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+
5+
// +build !race
6+
7+
package race
8+
9+
import (
10+
"unsafe"
11+
)
12+
13+
const Enabled = false
14+
15+
func Acquire(addr unsafe.Pointer) {
16+
}
17+
18+
func Release(addr unsafe.Pointer) {
19+
}
20+
21+
func ReleaseMerge(addr unsafe.Pointer) {
22+
}
23+
24+
func Disable() {
25+
}
26+
27+
func Enable() {
28+
}
29+
30+
func Read(addr unsafe.Pointer) {
31+
}
32+
33+
func Write(addr unsafe.Pointer) {
34+
}
35+
36+
func ReadRange(addr unsafe.Pointer, len int) {
37+
}
38+
39+
func WriteRange(addr unsafe.Pointer, len int) {
40+
}

src/internal/race/race.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright 2015 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+
5+
// +build race
6+
7+
package race
8+
9+
import (
10+
"runtime"
11+
"unsafe"
12+
)
13+
14+
const Enabled = true
15+
16+
func Acquire(addr unsafe.Pointer) {
17+
runtime.RaceAcquire(addr)
18+
}
19+
20+
func Release(addr unsafe.Pointer) {
21+
runtime.RaceRelease(addr)
22+
}
23+
24+
func ReleaseMerge(addr unsafe.Pointer) {
25+
runtime.RaceReleaseMerge(addr)
26+
}
27+
28+
func Disable() {
29+
runtime.RaceDisable()
30+
}
31+
32+
func Enable() {
33+
runtime.RaceEnable()
34+
}
35+
36+
func Read(addr unsafe.Pointer) {
37+
runtime.RaceRead(addr)
38+
}
39+
40+
func Write(addr unsafe.Pointer) {
41+
runtime.RaceWrite(addr)
42+
}
43+
44+
func ReadRange(addr unsafe.Pointer, len int) {
45+
runtime.RaceReadRange(addr, len)
46+
}
47+
48+
func WriteRange(addr unsafe.Pointer, len int) {
49+
runtime.RaceWriteRange(addr, len)
50+
}

src/net/fd_windows.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package net
66

77
import (
8+
"internal/race"
89
"os"
910
"runtime"
1011
"sync"
@@ -461,8 +462,8 @@ func (fd *netFD) Read(buf []byte) (int, error) {
461462
n, err := rsrv.ExecIO(o, "WSARecv", func(o *operation) error {
462463
return syscall.WSARecv(o.fd.sysfd, &o.buf, 1, &o.qty, &o.flags, &o.o, nil)
463464
})
464-
if raceenabled {
465-
raceAcquire(unsafe.Pointer(&ioSync))
465+
if race.Enabled {
466+
race.Acquire(unsafe.Pointer(&ioSync))
466467
}
467468
err = fd.eofError(n, err)
468469
if _, ok := err.(syscall.Errno); ok {
@@ -504,8 +505,8 @@ func (fd *netFD) Write(buf []byte) (int, error) {
504505
return 0, err
505506
}
506507
defer fd.writeUnlock()
507-
if raceenabled {
508-
raceReleaseMerge(unsafe.Pointer(&ioSync))
508+
if race.Enabled {
509+
race.ReleaseMerge(unsafe.Pointer(&ioSync))
509510
}
510511
o := &fd.wop
511512
o.InitBuf(buf)

src/net/race.go

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/net/race0.go

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/sync/cond.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package sync
66

77
import (
8+
"internal/race"
89
"sync/atomic"
910
"unsafe"
1011
)
@@ -51,12 +52,12 @@ func NewCond(l Locker) *Cond {
5152
//
5253
func (c *Cond) Wait() {
5354
c.checker.check()
54-
if raceenabled {
55-
raceDisable()
55+
if race.Enabled {
56+
race.Disable()
5657
}
5758
atomic.AddUint32(&c.waiters, 1)
58-
if raceenabled {
59-
raceEnable()
59+
if race.Enabled {
60+
race.Enable()
6061
}
6162
c.L.Unlock()
6263
runtime_Syncsemacquire(&c.sema)
@@ -81,14 +82,14 @@ func (c *Cond) Broadcast() {
8182

8283
func (c *Cond) signalImpl(all bool) {
8384
c.checker.check()
84-
if raceenabled {
85-
raceDisable()
85+
if race.Enabled {
86+
race.Disable()
8687
}
8788
for {
8889
old := atomic.LoadUint32(&c.waiters)
8990
if old == 0 {
90-
if raceenabled {
91-
raceEnable()
91+
if race.Enabled {
92+
race.Enable()
9293
}
9394
return
9495
}
@@ -97,8 +98,8 @@ func (c *Cond) signalImpl(all bool) {
9798
new = 0
9899
}
99100
if atomic.CompareAndSwapUint32(&c.waiters, old, new) {
100-
if raceenabled {
101-
raceEnable()
101+
if race.Enabled {
102+
race.Enable()
102103
}
103104
runtime_Syncsemrelease(&c.sema, old-new)
104105
return

src/sync/export_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,3 @@ package sync
77
// Export for testing.
88
var Runtime_Semacquire = runtime_Semacquire
99
var Runtime_Semrelease = runtime_Semrelease
10-
11-
const RaceEnabled = raceenabled

src/sync/mutex.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
package sync
1212

1313
import (
14+
"internal/race"
1415
"sync/atomic"
1516
"unsafe"
1617
)
@@ -41,8 +42,8 @@ const (
4142
func (m *Mutex) Lock() {
4243
// Fast path: grab unlocked mutex.
4344
if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
44-
if raceenabled {
45-
raceAcquire(unsafe.Pointer(m))
45+
if race.Enabled {
46+
race.Acquire(unsafe.Pointer(m))
4647
}
4748
return
4849
}
@@ -85,8 +86,8 @@ func (m *Mutex) Lock() {
8586
}
8687
}
8788

88-
if raceenabled {
89-
raceAcquire(unsafe.Pointer(m))
89+
if race.Enabled {
90+
race.Acquire(unsafe.Pointer(m))
9091
}
9192
}
9293

@@ -97,9 +98,9 @@ func (m *Mutex) Lock() {
9798
// It is allowed for one goroutine to lock a Mutex and then
9899
// arrange for another goroutine to unlock it.
99100
func (m *Mutex) Unlock() {
100-
if raceenabled {
101+
if race.Enabled {
101102
_ = m.state
102-
raceRelease(unsafe.Pointer(m))
103+
race.Release(unsafe.Pointer(m))
103104
}
104105

105106
// Fast path: drop lock bit.

src/sync/pool.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package sync
66

77
import (
8+
"internal/race"
89
"runtime"
910
"sync/atomic"
1011
"unsafe"
@@ -59,7 +60,7 @@ type poolLocal struct {
5960

6061
// Put adds x to the pool.
6162
func (p *Pool) Put(x interface{}) {
62-
if raceenabled {
63+
if race.Enabled {
6364
// Under race detector the Pool degenerates into no-op.
6465
// It's conforming, simple and does not introduce excessive
6566
// happens-before edges between unrelated goroutines.
@@ -91,7 +92,7 @@ func (p *Pool) Put(x interface{}) {
9192
// If Get would otherwise return nil and p.New is non-nil, Get returns
9293
// the result of calling p.New.
9394
func (p *Pool) Get() interface{} {
94-
if raceenabled {
95+
if race.Enabled {
9596
if p.New != nil {
9697
return p.New()
9798
}

0 commit comments

Comments
 (0)