mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-05-22 15:59:26 +00:00
Update event.go
This commit is contained in:
parent
ffe9dc97e5
commit
16fb4f7181
1 changed files with 17 additions and 5 deletions
|
|
@ -206,12 +206,24 @@ func (s *TypeMuxSubscription) deliver(event *TypeMuxEvent) {
|
||||||
if s.created.After(event.Time) {
|
if s.created.After(event.Time) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Otherwise deliver the event
|
// Copy postC under lock, then release lock before blocking select
|
||||||
s.postMu.RLock()
|
s.postMu.RLock()
|
||||||
defer s.postMu.RUnlock()
|
postC := s.postC
|
||||||
|
s.postMu.RUnlock()
|
||||||
|
|
||||||
select {
|
if postC == nil {
|
||||||
case s.postC <- event:
|
return
|
||||||
case <-s.closing:
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use recover to safely handle case where channel was closed
|
||||||
|
// between copying postC and entering select
|
||||||
|
func() {
|
||||||
|
defer func() {
|
||||||
|
recover() // Ignore panic from send on closed channel
|
||||||
|
}()
|
||||||
|
select {
|
||||||
|
case postC <- event:
|
||||||
|
case <-s.closing:
|
||||||
|
}
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue