Salome HOME
0020832: EDF 1359 SMESH : Automatic meshing of boundary layers
authoreap <eap@opencascade.com>
Thu, 16 Dec 2010 15:41:22 +0000 (15:41 +0000)
committereap <eap@opencascade.com>
Thu, 16 Dec 2010 15:41:22 +0000 (15:41 +0000)
   prevent infinit recursion via event notification

src/SMESH/SMESH_subMesh.cxx
src/SMESH/SMESH_subMeshEventListener.hxx

index 69b33a94c85ad2861a6576b10c4a08d373140705..1fcbd3407c8906dc8b9e811dfec4185985da61e6 100644 (file)
@@ -2067,8 +2067,6 @@ EventListenerData* SMESH_subMesh::GetEventListenerData(EventListener* listener)
  * \brief Notify stored event listeners on the occured event
  * \param event - algo_event or compute_event itself
  * \param eventType - algo_event or compute_event
- * \param subMesh - the submesh where the event occures
- * \param data - listener data stored in the subMesh
  * \param hyp - hypothesis, if eventType is algo_event
  */
 //================================================================================
@@ -2079,7 +2077,12 @@ void SMESH_subMesh::NotifyListenersOnEvent( const int         event,
 {
   map< EventListener*, EventListenerData* >::iterator l_d = myEventListeners.begin();
   for ( ; l_d != myEventListeners.end(); ++l_d )
-    l_d->first->ProcessEvent( event, eventType, this, l_d->second, hyp );
+    if ( ! (*l_d).first->myIsBusy )
+    {
+      l_d->first->myIsBusy = true;
+      l_d->first->ProcessEvent( event, eventType, this, l_d->second, hyp );
+      l_d->first->myIsBusy = false;
+    }
 }
 
 //================================================================================
index 99e66e865fb50d325118b84d383403217851131b..81dccca465ecd93e14d97d1ae1159ab48171a884 100644 (file)
@@ -44,8 +44,10 @@ struct SMESH_subMeshEventListenerData;
 
 class SMESH_EXPORT SMESH_subMeshEventListener {
   bool myIsDeletable; //!< if true, it will be deleted by SMESH_subMesh
+  mutable bool myIsBusy; //!< to avoid infinite recursion
+  friend class SMESH_subMesh;
 public:
-  SMESH_subMeshEventListener(bool isDeletable):myIsDeletable(isDeletable) {}
+  SMESH_subMeshEventListener(bool isDeletable):myIsDeletable(isDeletable),myIsBusy(false) {}
   bool IsDeletable() const { return myIsDeletable; }
   /*!
    * \brief Do something on a certain event