mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-02-26 15:47:21 +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) {
|
||||
return
|
||||
}
|
||||
// Otherwise deliver the event
|
||||
// Copy postC under lock, then release lock before blocking select
|
||||
s.postMu.RLock()
|
||||
defer s.postMu.RUnlock()
|
||||
postC := s.postC
|
||||
s.postMu.RUnlock()
|
||||
|
||||
select {
|
||||
case s.postC <- event:
|
||||
case <-s.closing:
|
||||
if postC == nil {
|
||||
return
|
||||
}
|
||||
|
||||
// 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