diff options
author | Ian Gudger <igudger@google.com> | 2020-01-10 13:33:12 -0800 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-01-10 13:34:48 -0800 |
commit | 6b83111499e9a8f42b6aa3998839922ba70eefdc (patch) | |
tree | 39f0a625314eea198ffb8768974239d1dd532211 /pkg/goid/goid_unsafe.go | |
parent | dacd349d6fb4fc7453b1fbf694158fd25496ed42 (diff) |
goid: new package
Allows retrieving the goroutine ID for concurrency testing when the race
detector is enabled.
Updates #1472
PiperOrigin-RevId: 289155308
Diffstat (limited to 'pkg/goid/goid_unsafe.go')
-rw-r--r-- | pkg/goid/goid_unsafe.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/pkg/goid/goid_unsafe.go b/pkg/goid/goid_unsafe.go new file mode 100644 index 000000000..ded8004dd --- /dev/null +++ b/pkg/goid/goid_unsafe.go @@ -0,0 +1,64 @@ +// Copyright 2020 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package 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. +} + +func getg() *g + +// goid returns the ID of the current goroutine. +func goid() int64 { + return getg().goid +} |