mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-15 18:18:34 +05:00
0021375: EDF 1671 SMESH: Dump study of current state
avoid crash at deletion of SMESH_subMesh::myOwnListeners at mesh removal - std::list< std::pair< SMESH_subMesh*, EventListener* > > myOwnListeners; + struct OwnListenerData { + ... + }; + std::list< OwnListenerData > myOwnListeners;
This commit is contained in:
parent
14e44c7736
commit
785e19b0ca
@ -1992,14 +1992,26 @@ SMESH_Hypothesis::Hypothesis_Status
|
|||||||
return SMESH_Hypothesis::HYP_OK;
|
return SMESH_Hypothesis::HYP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*!
|
||||||
|
* \brief Constructor of OwnListenerData
|
||||||
|
*/
|
||||||
|
//================================================================================
|
||||||
|
|
||||||
|
SMESH_subMesh::OwnListenerData::OwnListenerData( SMESH_subMesh* sm, EventListener* el):
|
||||||
|
mySubMesh( sm ),
|
||||||
|
myMeshID( sm ? sm->GetFather()->GetId() : -1 ),
|
||||||
|
mySubMeshID( sm ? sm->GetId() : -1 ),
|
||||||
|
myListener( el )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
//================================================================================
|
//================================================================================
|
||||||
/*!
|
/*!
|
||||||
* \brief Sets an event listener and its data to a submesh
|
* \brief Sets an event listener and its data to a submesh
|
||||||
* \param listener - the listener to store
|
* \param listener - the listener to store
|
||||||
* \param data - the listener data to store
|
* \param data - the listener data to store
|
||||||
* \param where - the submesh to store the listener and it's data
|
* \param where - the submesh to store the listener and it's data
|
||||||
* \param deleteListener - if true then the listener will be deleted as
|
|
||||||
* it is removed from where submesh
|
|
||||||
*
|
*
|
||||||
* It remembers the submesh where it puts the listener in order to delete
|
* It remembers the submesh where it puts the listener in order to delete
|
||||||
* them when HYP_OK algo_state is lost
|
* them when HYP_OK algo_state is lost
|
||||||
@ -2013,7 +2025,7 @@ void SMESH_subMesh::SetEventListener(EventListener* listener,
|
|||||||
{
|
{
|
||||||
if ( listener && where ) {
|
if ( listener && where ) {
|
||||||
where->SetEventListener( listener, data );
|
where->SetEventListener( listener, data );
|
||||||
myOwnListeners.push_back( make_pair( where, listener ));
|
myOwnListeners.push_back( OwnListenerData( where, listener ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2112,9 +2124,15 @@ void SMESH_subMesh::DeleteEventListener(EventListener* listener)
|
|||||||
|
|
||||||
void SMESH_subMesh::DeleteOwnListeners()
|
void SMESH_subMesh::DeleteOwnListeners()
|
||||||
{
|
{
|
||||||
list< pair< SMESH_subMesh*, EventListener* > >::iterator sm_l;
|
list< OwnListenerData >::iterator d;
|
||||||
for ( sm_l = myOwnListeners.begin(); sm_l != myOwnListeners.end(); ++sm_l)
|
for ( d = myOwnListeners.begin(); d != myOwnListeners.end(); ++d )
|
||||||
sm_l->first->DeleteEventListener( sm_l->second );
|
{
|
||||||
|
if ( !_father->MeshExists( d->myMeshID ))
|
||||||
|
continue;
|
||||||
|
if ( _father->GetId() == d->myMeshID && !_father->GetSubMeshContaining( d->mySubMeshID ))
|
||||||
|
continue;
|
||||||
|
d->mySubMesh->DeleteEventListener( d->myListener );
|
||||||
|
}
|
||||||
myOwnListeners.clear();
|
myOwnListeners.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,7 +153,14 @@ protected:
|
|||||||
//!< event listeners to notify
|
//!< event listeners to notify
|
||||||
std::map< EventListener*, EventListenerData* > myEventListeners;
|
std::map< EventListener*, EventListenerData* > myEventListeners;
|
||||||
//!< event listeners to delete when HYP_OK algo_state is lost
|
//!< event listeners to delete when HYP_OK algo_state is lost
|
||||||
std::list< std::pair< SMESH_subMesh*, EventListener* > > myOwnListeners;
|
struct OwnListenerData {
|
||||||
|
SMESH_subMesh* mySubMesh;
|
||||||
|
int myMeshID; // id of mySubMesh->GetFather()
|
||||||
|
int mySubMeshID;
|
||||||
|
EventListener* myListener;
|
||||||
|
OwnListenerData( SMESH_subMesh* sm=0, EventListener* el=0);
|
||||||
|
};
|
||||||
|
std::list< OwnListenerData > myOwnListeners;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Sets an event listener and its data to a submesh
|
* \brief Sets an event listener and its data to a submesh
|
||||||
|
Loading…
Reference in New Issue
Block a user