mirror of
https://github.com/golang/go
synced 2024-11-19 14:34:42 -07:00
c82efb1fa3
If g1 sets its labels and then they are copied into a profile buffer and then g2 reads the profile buffer and inspects the labels, the race detector must understand that g1's recording of the labels happens before g2's use of the labels. Make that so. Fixes race test failure in CL 39613. Change-Id: Id7cda1c2aac6f8eef49213b5ca414f7154b4acfa Reviewed-on: https://go-review.googlesource.com/42111 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Michael Matloob <matloob@golang.org>
26 lines
768 B
Go
26 lines
768 B
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package runtime
|
|
|
|
import "unsafe"
|
|
|
|
var labelSync uintptr
|
|
|
|
//go:linkname runtime_setProfLabel runtime/pprof.runtime_setProfLabel
|
|
func runtime_setProfLabel(labels unsafe.Pointer) {
|
|
// Introduce race edge for read-back via profile.
|
|
// This would more properly use &getg().labels as the sync address,
|
|
// but we do the read in a signal handler and can't call the race runtime then.
|
|
if raceenabled {
|
|
racerelease(unsafe.Pointer(&labelSync))
|
|
}
|
|
getg().labels = labels
|
|
}
|
|
|
|
//go:linkname runtime_getProfLabel runtime/pprof.runtime_getProfLabel
|
|
func runtime_getProfLabel() unsafe.Pointer {
|
|
return getg().labels
|
|
}
|