From 36550205e6a2af5cf9ee5415066f780b1478478f Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 29 Apr 2013 12:00:40 +0000 Subject: [PATCH] 0022202: EDF SMESH: Regression in a script meshing prisms and hexaedrons Fix notifyListenersOnEvent() for the case of removing an EventListener --- src/SMESH/SMESH_subMesh.cxx | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index aa2d1dd1d..ba6118097 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -2258,19 +2258,29 @@ void SMESH_subMesh::notifyListenersOnEvent( const int event, const event_type eventType, SMESH_Hypothesis* hyp) { - map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin(); - for ( ; l_d != _eventListeners.end(); ) + set< EventListener* > notified; + const size_t nbListeners = _eventListeners.size(); + while ( notified.size() != nbListeners ) { - std::pair< EventListener*, EventListenerData* > li_da = *l_d++; /* copy to enable removal - of a listener from - _eventListeners by - its ProcessEvent() */ - if ( li_da.first->myBusySM.insert( this ).second ) + map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin(); + for ( ; l_d != _eventListeners.end(); ++l_d ) { - const size_t nbListenersBefore = _eventListeners.size(); - li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp ); - if ( nbListenersBefore == _eventListeners.size() ) - li_da.first->myBusySM.erase( this ); // a listener hopefully not removed + std::pair< EventListener*, EventListenerData* > li_da = *l_d; + + if ( notified.insert( li_da.first ).second && + li_da.first->myBusySM.insert( this ).second ) + { + const bool isDeletable = li_da.first->IsDeletable(); + + li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp ); + + const bool isRemoved = !_eventListeners.count( li_da.first ); + if ( !isDeletable || !isRemoved ) + li_da.first->myBusySM.erase( this ); // a listener is hopefully not dead + + if ( isRemoved ) + break; // restart looping on _eventListeners + } } } } -- 2.39.2