X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_subMesh.cxx;h=19df51879a632adabcfc1260007c7178aed8b9e1;hb=refs%2Ftags%2FV7_2_0;hp=fbd593e8bf361e2c754d575f94e4b0c07679fd07;hpb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index fbd593e8b..19df51879 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -1463,8 +1463,8 @@ bool SMESH_subMesh::ComputeStateEngine(int event) if (_father->HasShapeToMesh() ) { bool subComputed = false, subFailed = false; if (!algo->OnlyUnaryInput()) { - if ( event == COMPUTE && - ( algo->NeedDiscreteBoundary() || algo->SupportSubmeshes() )) + if ( event == COMPUTE /*&& + ( algo->NeedDiscreteBoundary() || algo->SupportSubmeshes() )*/) shape = getCollection( gen, algo, subComputed, subFailed ); else subComputed = SubMeshesComputed( & subFailed ); @@ -2258,19 +2258,22 @@ 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(); ) + 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 ) { - std::pair< EventListener*, EventListenerData* > li_da = *l_d++; /* copy to enable removal - of a listener from - _eventListeners by - its ProcessEvent() */ + std::pair< EventListener*, EventListenerData* > li_da = *l_d; + if ( !_eventListeners.count( li_da.first )) continue; + if ( li_da.first->myBusySM.insert( this ).second ) { - const size_t nbListenersBefore = _eventListeners.size(); + const bool isDeletable = li_da.first->IsDeletable(); + 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 + + if ( !isDeletable || !_eventListeners.count( li_da.first )) + li_da.first->myBusySM.erase( this ); // a listener is hopefully not dead } } }