26 lines
699 B
Go
26 lines
699 B
Go
package gls
|
|
|
|
var (
|
|
stackTagPool = &idPool{}
|
|
)
|
|
|
|
// Will return this goroutine's identifier if set. If you always need a
|
|
// goroutine identifier, you should use EnsureGoroutineId which will make one
|
|
// if there isn't one already.
|
|
func GetGoroutineId() (gid uint, ok bool) {
|
|
return readStackTag()
|
|
}
|
|
|
|
// Will call cb with the current goroutine identifier. If one hasn't already
|
|
// been generated, one will be created and set first. The goroutine identifier
|
|
// might be invalid after cb returns.
|
|
func EnsureGoroutineId(cb func(gid uint)) {
|
|
if gid, ok := readStackTag(); ok {
|
|
cb(gid)
|
|
return
|
|
}
|
|
gid := stackTagPool.Acquire()
|
|
defer stackTagPool.Release(gid)
|
|
addStackTag(gid, func() { cb(gid) })
|
|
}
|