From cbd9eca6c3a40feaaa6f43eaf6e4e957864a5e2e Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 5 Feb 2021 15:46:44 +1100 Subject: [PATCH] Don't manipulate listeners array when expired --- lib/event/manager.go | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/lib/event/manager.go b/lib/event/manager.go index 8e855bb40..23e4f31c8 100644 --- a/lib/event/manager.go +++ b/lib/event/manager.go @@ -139,18 +139,17 @@ func (e *Manager) Start(renderer interfaces.Renderer) { e.mu.Lock() - // Notify Go listeners - var listenersToRemove int - // Iterate listeners for _, listener := range e.listeners[event.Name] { - // Call listener, perhaps with data - if event.Data == nil { - go listener.callback() - } else { - unpacked := event.Data.([]interface{}) - go listener.callback(unpacked...) + if !listener.expired { + // Call listener, perhaps with data + if event.Data == nil { + go listener.callback() + } else { + unpacked := event.Data.([]interface{}) + go listener.callback(unpacked...) + } } // Update listen counter @@ -158,22 +157,10 @@ func (e *Manager) Start(renderer interfaces.Renderer) { listener.counter = listener.counter - 1 if listener.counter == 0 { listener.expired = true - listenersToRemove++ } } } - // Remove expired listeners in place - if listenersToRemove > 0 { - listeners := e.listeners[event.Name] - for index, listener := range listeners { - if listener.expired { - listeners[index] = listeners[len(listeners)-1] - listeners[len(listeners)-1] = nil - e.listeners[event.Name] = listeners[:len(listeners)-1] - } - } - } e.mu.Unlock() case <-e.quitChannel: