mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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:
parent
6247ca2dbb
commit
56e5e0b69c
4 changed files with 41 additions and 8 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue