Source file src/runtime/proflabel.go
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 5 package runtime 6 7 import "unsafe" 8 9 var labelSync uintptr 10 11 // runtime_setProfLabel should be an internal detail, 12 // but widely used packages access it using linkname. 13 // Notable members of the hall of shame include: 14 // - github.com/cloudwego/localsession 15 // - github.com/DataDog/datadog-agent 16 // 17 // Do not remove or change the type signature. 18 // See go.dev/issue/67401. 19 // 20 //go:linkname runtime_setProfLabel runtime/pprof.runtime_setProfLabel 21 func runtime_setProfLabel(labels unsafe.Pointer) { 22 // Introduce race edge for read-back via profile. 23 // This would more properly use &getg().labels as the sync address, 24 // but we do the read in a signal handler and can't call the race runtime then. 25 // 26 // This uses racereleasemerge rather than just racerelease so 27 // the acquire in profBuf.read synchronizes with *all* prior 28 // setProfLabel operations, not just the most recent one. This 29 // is important because profBuf.read will observe different 30 // labels set by different setProfLabel operations on 31 // different goroutines, so it needs to synchronize with all 32 // of them (this wouldn't be an issue if we could synchronize 33 // on &getg().labels since we would synchronize with each 34 // most-recent labels write separately.) 35 // 36 // racereleasemerge is like a full read-modify-write on 37 // labelSync, rather than just a store-release, so it carries 38 // a dependency on the previous racereleasemerge, which 39 // ultimately carries forward to the acquire in profBuf.read. 40 if raceenabled { 41 racereleasemerge(unsafe.Pointer(&labelSync)) 42 } 43 getg().labels = labels 44 } 45 46 // runtime_getProfLabel should be an internal detail, 47 // but widely used packages access it using linkname. 48 // Notable members of the hall of shame include: 49 // - github.com/cloudwego/localsession 50 // - github.com/DataDog/datadog-agent 51 // 52 // Do not remove or change the type signature. 53 // See go.dev/issue/67401. 54 // 55 //go:linkname runtime_getProfLabel runtime/pprof.runtime_getProfLabel 56 func runtime_getProfLabel() unsafe.Pointer { 57 return getg().labels 58 } 59