summaryrefslogtreecommitdiffhomepage
path: root/pkg/goid/goid.go
diff options
context:
space:
mode:
authorJamie Liu <jamieliu@google.com>2020-11-12 19:10:01 -0800
committergVisor bot <gvisor-bot@google.com>2020-11-12 19:16:29 -0800
commitbf392dcc7d7b1f256acfe8acd2758a77db3fc8a2 (patch)
tree1cfddc7e2bd5b7de20139520836b332e29f961f8 /pkg/goid/goid.go
parentcf47c8b4a5d22f317cb88ee1c11b5c695c508d1f (diff)
Allow goid.Get() to be used outside of race builds.
PiperOrigin-RevId: 342179912
Diffstat (limited to 'pkg/goid/goid.go')
-rw-r--r--pkg/goid/goid.go56
1 files changed, 52 insertions, 4 deletions
diff --git a/pkg/goid/goid.go b/pkg/goid/goid.go
index 39df30031..17c384cb0 100644
--- a/pkg/goid/goid.go
+++ b/pkg/goid/goid.go
@@ -12,13 +12,61 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-// +build !race
+// +build go1.12
+// +build !go1.17
-// Package goid provides access to the ID of the current goroutine in
-// race/gotsan builds.
+// Check type signatures when updating Go version.
+
+// Package goid provides the Get function.
package goid
// Get returns the ID of the current goroutine.
func Get() int64 {
- panic("unimplemented for non-race builds")
+ return getg().goid
+}
+
+// Structs from Go runtime. These may change in the future and require
+// updating. These structs are currently the same on both AMD64 and ARM64,
+// but may diverge in the future.
+
+type stack struct {
+ lo uintptr
+ hi uintptr
+}
+
+type gobuf struct {
+ sp uintptr
+ pc uintptr
+ g uintptr
+ ctxt uintptr
+ ret uint64
+ lr uintptr
+ bp uintptr
}
+
+type g struct {
+ stack stack
+ stackguard0 uintptr
+ stackguard1 uintptr
+
+ _panic uintptr
+ _defer uintptr
+ m uintptr
+ sched gobuf
+ syscallsp uintptr
+ syscallpc uintptr
+ stktopsp uintptr
+ param uintptr
+ atomicstatus uint32
+ stackLock uint32
+ goid int64
+
+ // More fields...
+ //
+ // We only use goid and the fields before it are only listed to
+ // calculate the correct offset.
+}
+
+// Defined in assembly. This can't use go:linkname since runtime.getg() isn't a
+// real function, it's a compiler intrinsic.
+func getg() *g