You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
25 lines
699 B
25 lines
699 B
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) }) |
|
}
|
|
|