infra
/
goutils
Archived
1
0
Fork 0
This repository has been archived on 2022-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
goutils/runtime/runtime.go

56 lines
770 B
Go

package runtime
import (
"reflect"
"unsafe"
)
var (
offsetGoid uintptr
offsetSched uintptr
)
func init() {
pg, err := TypeByString("*runtime.g")
if err != nil {
return
}
if pg.Kind() != reflect.Ptr {
return
}
g := pg.Elem()
if g.Kind() != reflect.Struct {
return
}
goid, ok := g.FieldByName("goid")
if !ok {
return
}
sched, ok := g.FieldByName("sched")
if !ok {
return
}
offsetGoid = goid.Offset
offsetSched = sched.Offset
}
//go:linkname mcall runtime.mcall
//go:nosplit
func mcall(func(uintptr))
//go:linkname gogo runtime.gogo
//go:nosplit
func gogo(uintptr)
func GOID() (goid int64) {
mcall(func(g uintptr) {
id := unsafe.Pointer(g + offsetGoid)
goid = *(*int64)(id)
sched := g + offsetSched
gogo(sched)
})
return
}