mirror of
https://github.com/sst/opencode.git
synced 2025-08-04 21:38:01 +00:00
fix: pubsub leak and shutdown seq
This commit is contained in:
parent
afcdabd095
commit
3cc08494a5
3 changed files with 170 additions and 16 deletions
|
@ -64,22 +64,27 @@ func (b *Broker[T]) Subscribe(ctx context.Context) <-chan Event[T] {
|
|||
b.subs[sub] = struct{}{}
|
||||
b.subCount++
|
||||
|
||||
go func() {
|
||||
<-ctx.Done()
|
||||
// Only start a goroutine if the context can actually be canceled
|
||||
if ctx.Done() != nil {
|
||||
go func() {
|
||||
<-ctx.Done()
|
||||
|
||||
b.mu.Lock()
|
||||
defer b.mu.Unlock()
|
||||
b.mu.Lock()
|
||||
defer b.mu.Unlock()
|
||||
|
||||
select {
|
||||
case <-b.done:
|
||||
return
|
||||
default:
|
||||
}
|
||||
select {
|
||||
case <-b.done:
|
||||
return
|
||||
default:
|
||||
}
|
||||
|
||||
delete(b.subs, sub)
|
||||
close(sub)
|
||||
b.subCount--
|
||||
}()
|
||||
if _, exists := b.subs[sub]; exists {
|
||||
delete(b.subs, sub)
|
||||
close(sub)
|
||||
b.subCount--
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
return sub
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue