56 lines
770 B
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
|
|
}
|