From: eap Date: Mon, 29 Apr 2013 14:18:32 +0000 (+0000) Subject: 0022202: EDF SMESH: Regression in a script meshing prisms and hexaedrons X-Git-Tag: V7_2_0 X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=commitdiff_plain;h=89682777f7aaf6ec0b3cccf21320ccd4576dcfc7;hp=36550205e6a2af5cf9ee5415066f780b1478478f 0022202: EDF SMESH: Regression in a script meshing prisms and hexaedrons Fix notifyListenersOnEvent() for the case of removing an EventListener (attempt No.2) --- diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index ba6118097..19df51879 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -2258,29 +2258,22 @@ void SMESH_subMesh::notifyListenersOnEvent( const int event, const event_type eventType, SMESH_Hypothesis* hyp) { - set< EventListener* > notified; - const size_t nbListeners = _eventListeners.size(); - while ( notified.size() != nbListeners ) + list< pair< EventListener*, EventListenerData* > > eventListeners( _eventListeners.begin(), + _eventListeners.end()); + list< pair< EventListener*, EventListenerData* > >::iterator l_d = eventListeners.begin(); + for ( ; l_d != eventListeners.end(); ++l_d ) { - map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin(); - for ( ; l_d != _eventListeners.end(); ++l_d ) - { - 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(); + std::pair< EventListener*, EventListenerData* > li_da = *l_d; + if ( !_eventListeners.count( li_da.first )) continue; - li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp ); + if ( li_da.first->myBusySM.insert( this ).second ) + { + const bool isDeletable = li_da.first->IsDeletable(); - const bool isRemoved = !_eventListeners.count( li_da.first ); - if ( !isDeletable || !isRemoved ) - li_da.first->myBusySM.erase( this ); // a listener is hopefully not dead + li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp ); - if ( isRemoved ) - break; // restart looping on _eventListeners - } + if ( !isDeletable || !_eventListeners.count( li_da.first )) + li_da.first->myBusySM.erase( this ); // a listener is hopefully not dead } } }