1// Copyright 2017 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 runtime 6 7import "unsafe" 8 9var labelSync uintptr 10 11//go:linkname runtime_setProfLabel runtime_1pprof.runtime__setProfLabel 12func runtime_setProfLabel(labels unsafe.Pointer) { 13 // Introduce race edge for read-back via profile. 14 // This would more properly use &getg().labels as the sync address, 15 // but we do the read in a signal handler and can't call the race runtime then. 16 // 17 // This uses racereleasemerge rather than just racerelease so 18 // the acquire in profBuf.read synchronizes with *all* prior 19 // setProfLabel operations, not just the most recent one. This 20 // is important because profBuf.read will observe different 21 // labels set by different setProfLabel operations on 22 // different goroutines, so it needs to synchronize with all 23 // of them (this wouldn't be an issue if we could synchronize 24 // on &getg().labels since we would synchronize with each 25 // most-recent labels write separately.) 26 // 27 // racereleasemerge is like a full read-modify-write on 28 // labelSync, rather than just a store-release, so it carries 29 // a dependency on the previous racereleasemerge, which 30 // ultimately carries forward to the acquire in profBuf.read. 31 if raceenabled { 32 racereleasemerge(unsafe.Pointer(&labelSync)) 33 } 34 getg().labels = labels 35} 36 37//go:linkname runtime_getProfLabel runtime_1pprof.runtime__getProfLabel 38func runtime_getProfLabel() unsafe.Pointer { 39 return getg().labels 40} 41