From 183622c7184f4cda884106843d3a82b66ea446ba Mon Sep 17 00:00:00 2001 From: James Chen Date: Thu, 6 Mar 2014 10:45:29 +0800 Subject: [PATCH] 'EventDispatcherTest/Issue 4129' crashes on Windows. --- cocos/2d/CCEventDispatcher.cpp | 31 ++++++++++++++----- .../NewEventDispatcherTest.cpp | 10 ++++-- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/cocos/2d/CCEventDispatcher.cpp b/cocos/2d/CCEventDispatcher.cpp index 922b879414..6dedb2f3cb 100644 --- a/cocos/2d/CCEventDispatcher.cpp +++ b/cocos/2d/CCEventDispatcher.cpp @@ -882,13 +882,16 @@ void EventDispatcher::dispatchTouchEvent(EventTouch* event) void EventDispatcher::updateListeners(Event* event) { + CCASSERT(_inDispatch > 0, "If program goes here, there should be event in dispatch."); + auto onUpdateListeners = [this](const EventListener::ListenerID& listenerID) { auto listenersIter = _listenerMap.find(listenerID); if (listenersIter == _listenerMap.end()) return; - + auto listeners = listenersIter->second; + auto fixedPriorityListeners = listeners->getFixedPriorityListeners(); auto sceneGraphPriorityListeners = listeners->getSceneGraphPriorityListeners(); @@ -935,14 +938,8 @@ void EventDispatcher::updateListeners(Event* event) { listeners->clearFixedListeners(); } - - if (listenersIter->second->empty()) - { - _priorityDirtyFlagMap.erase(listenersIter->first); - delete listenersIter->second; - _listenerMap.erase(listenersIter); - } }; + if (event->getType() == Event::Type::TOUCH) { @@ -954,6 +951,24 @@ void EventDispatcher::updateListeners(Event* event) onUpdateListeners(__getListenerID(event)); } + if (_inDispatch > 1) + return; + + CCASSERT(_inDispatch == 1, "_inDispatch should be 1 here."); + + for (auto iter = _listenerMap.begin(); iter != _listenerMap.end();) + { + if (iter->second->empty()) + { + _priorityDirtyFlagMap.erase(iter->first); + delete iter->second; + iter = _listenerMap.erase(iter); + } + else + { + ++iter; + } + } if (!_toAddedListeners.empty()) { diff --git a/tests/Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp b/tests/Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp index 7b4ff93a6c..f766d914ef 100644 --- a/tests/Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp +++ b/tests/Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp @@ -1182,10 +1182,11 @@ Issue4129::Issue4129() // After test, remove it. _eventDispatcher->removeEventListener(_customlistener); - + _customlistener = nullptr; + _bugFixed = true; }); - + auto removeAllTouchItem = MenuItemFont::create("Remove All Listeners", [this](Ref* sender){ auto senderItem = static_cast(sender); senderItem->setString("Only 'Reset' item could be clicked"); @@ -1220,7 +1221,10 @@ Issue4129::Issue4129() Issue4129::~Issue4129() { - _eventDispatcher->removeEventListener(_customlistener); + if (_customlistener) + { + _eventDispatcher->removeEventListener(_customlistener); + } } std::string Issue4129::title() const