happy path perf optimization
move goroutineID() inside the defer, guarded by !finished. It's safe — Goexit runs defers in the same goroutine, so the ID is stable.
This commit is contained in:
parent
9599b8c0a3
commit
974fed55d3
@ -151,7 +151,6 @@ func Async[T any](fn func() T) <-chan Expect[T] {
|
|||||||
val T
|
val T
|
||||||
finished bool
|
finished bool
|
||||||
)
|
)
|
||||||
id := goroutineID()
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if v := recover(); v != nil {
|
if v := recover(); v != nil {
|
||||||
if err, ok := v.(*stackError); ok {
|
if err, ok := v.(*stackError); ok {
|
||||||
@ -165,7 +164,8 @@ func Async[T any](fn func() T) <-chan Expect[T] {
|
|||||||
ch <- Ok(val)
|
ch <- Ok(val)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if stored, ok := gErrors.LoadAndDelete(id); ok {
|
// goroutineID is looked up here, on the error path only.
|
||||||
|
if stored, ok := gErrors.LoadAndDelete(goroutineID()); ok {
|
||||||
ch <- Fail[T](stored.(error))
|
ch <- Fail[T](stored.(error))
|
||||||
} else {
|
} else {
|
||||||
ch <- Fail[T](errors.New("goroutine exited unexpectedly"))
|
ch <- Fail[T](errors.New("goroutine exited unexpectedly"))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user