runtime: tell race detector about reflectOffs.lock

Fixes #15832

Change-Id: I6f3f45e3c21edd0e093ecb1d8a067907863478f5
Reviewed-on: https://go-review.googlesource.com/23441
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
This commit is contained in:
David Crawshaw 2016-05-25 13:19:11 -04:00
parent 6247ca2dbb
commit 56e5e0b69c
4 changed files with 41 additions and 8 deletions

View file

@ -169,6 +169,20 @@ var reflectOffs struct {
minv map[unsafe.Pointer]int32
}
func reflectOffsLock() {
lock(&reflectOffs.lock)
if raceenabled {
raceacquire(unsafe.Pointer(&reflectOffs.lock))
}
}
func reflectOffsUnlock() {
if raceenabled {
racerelease(unsafe.Pointer(&reflectOffs.lock))
}
unlock(&reflectOffs.lock)
}
func resolveNameOff(ptrInModule unsafe.Pointer, off nameOff) name {
if off == 0 {
return name{}
@ -182,9 +196,9 @@ func resolveNameOff(ptrInModule unsafe.Pointer, off nameOff) name {
}
}
if md == nil {
lock(&reflectOffs.lock)
reflectOffsLock()
res, found := reflectOffs.m[int32(off)]
unlock(&reflectOffs.lock)
reflectOffsUnlock()
if !found {
println("runtime: nameOff", hex(off), "base", hex(base), "not in ranges:")
for next := &firstmoduledata; next != nil; next = next.next {
@ -219,9 +233,9 @@ func (t *_type) typeOff(off typeOff) *_type {
}
}
if md == nil {
lock(&reflectOffs.lock)
reflectOffsLock()
res := reflectOffs.m[int32(off)]
unlock(&reflectOffs.lock)
reflectOffsUnlock()
if res == nil {
println("runtime: typeOff", hex(off), "base", hex(base), "not in ranges:")
for next := &firstmoduledata; next != nil; next = next.next {
@ -252,9 +266,9 @@ func (t *_type) textOff(off textOff) unsafe.Pointer {
}
}
if md == nil {
lock(&reflectOffs.lock)
reflectOffsLock()
res := reflectOffs.m[int32(off)]
unlock(&reflectOffs.lock)
reflectOffsUnlock()
if res == nil {
println("runtime: textOff", hex(off), "base", hex(base), "not in ranges:")
for next := &firstmoduledata; next != nil; next = next.next {