Merge pull request #5575 from dumganhar/iss4286-event-crash

closed #4286: 'EventDispatcherTest/Issue 4129' crashes on Windows.
This commit is contained in:
James Chen 2014-03-06 11:03:34 +08:00
commit 87b657b5bb
2 changed files with 30 additions and 11 deletions

View File

@ -882,13 +882,16 @@ void EventDispatcher::dispatchTouchEvent(EventTouch* event)
void EventDispatcher::updateListeners(Event* 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 onUpdateListeners = [this](const EventListener::ListenerID& listenerID)
{ {
auto listenersIter = _listenerMap.find(listenerID); auto listenersIter = _listenerMap.find(listenerID);
if (listenersIter == _listenerMap.end()) if (listenersIter == _listenerMap.end())
return; return;
auto listeners = listenersIter->second; auto listeners = listenersIter->second;
auto fixedPriorityListeners = listeners->getFixedPriorityListeners(); auto fixedPriorityListeners = listeners->getFixedPriorityListeners();
auto sceneGraphPriorityListeners = listeners->getSceneGraphPriorityListeners(); auto sceneGraphPriorityListeners = listeners->getSceneGraphPriorityListeners();
@ -935,14 +938,8 @@ void EventDispatcher::updateListeners(Event* event)
{ {
listeners->clearFixedListeners(); listeners->clearFixedListeners();
} }
if (listenersIter->second->empty())
{
_priorityDirtyFlagMap.erase(listenersIter->first);
delete listenersIter->second;
_listenerMap.erase(listenersIter);
}
}; };
if (event->getType() == Event::Type::TOUCH) if (event->getType() == Event::Type::TOUCH)
{ {
@ -954,6 +951,24 @@ void EventDispatcher::updateListeners(Event* event)
onUpdateListeners(__getListenerID(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()) if (!_toAddedListeners.empty())
{ {

View File

@ -1182,10 +1182,11 @@ Issue4129::Issue4129()
// After test, remove it. // After test, remove it.
_eventDispatcher->removeEventListener(_customlistener); _eventDispatcher->removeEventListener(_customlistener);
_customlistener = nullptr;
_bugFixed = true; _bugFixed = true;
}); });
auto removeAllTouchItem = MenuItemFont::create("Remove All Listeners", [this](Ref* sender){ auto removeAllTouchItem = MenuItemFont::create("Remove All Listeners", [this](Ref* sender){
auto senderItem = static_cast<MenuItemFont*>(sender); auto senderItem = static_cast<MenuItemFont*>(sender);
senderItem->setString("Only 'Reset' item could be clicked"); senderItem->setString("Only 'Reset' item could be clicked");
@ -1220,7 +1221,10 @@ Issue4129::Issue4129()
Issue4129::~Issue4129() Issue4129::~Issue4129()
{ {
_eventDispatcher->removeEventListener(_customlistener); if (_customlistener)
{
_eventDispatcher->removeEventListener(_customlistener);
}
} }
std::string Issue4129::title() const std::string Issue4129::title() const