From ae38a4eb4491fe9a1c34276011aad6747c757697 Mon Sep 17 00:00:00 2001 From: David Rose Date: Mon, 25 Apr 2011 19:46:13 +0000 Subject: [PATCH] fix ode crash on exit --- panda/src/ode/config_ode.cxx | 12 +++++------ panda/src/ode/odeTriMeshData.I | 8 +++++++ panda/src/ode/odeTriMeshData.cxx | 36 ++++++++++++++++++-------------- panda/src/ode/odeTriMeshData.h | 3 ++- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/panda/src/ode/config_ode.cxx b/panda/src/ode/config_ode.cxx index 661434a37e..10a81b29bd 100755 --- a/panda/src/ode/config_ode.cxx +++ b/panda/src/ode/config_ode.cxx @@ -50,12 +50,12 @@ Configure(config_ode); NotifyCategoryDef(ode, ""); -NotifyCategoryDef(odeworld, ""); -NotifyCategoryDef(odebody, ""); -NotifyCategoryDef(odejoint, ""); -NotifyCategoryDef(odespace, ""); -NotifyCategoryDef(odegeom, ""); -NotifyCategoryDef(odetrimeshdata, ""); +NotifyCategoryDef(odeworld, "ode"); +NotifyCategoryDef(odebody, "ode"); +NotifyCategoryDef(odejoint, "ode"); +NotifyCategoryDef(odespace, "ode"); +NotifyCategoryDef(odegeom, "ode"); +NotifyCategoryDef(odetrimeshdata, "ode"); ConfigureFn(config_ode) { init_libode(); diff --git a/panda/src/ode/odeTriMeshData.I b/panda/src/ode/odeTriMeshData.I index 68a50b9a3c..b2025814bd 100755 --- a/panda/src/ode/odeTriMeshData.I +++ b/panda/src/ode/odeTriMeshData.I @@ -12,6 +12,14 @@ // //////////////////////////////////////////////////////////////////// +INLINE OdeTriMeshData::TriMeshDataMap &OdeTriMeshData:: +get_tri_mesh_data_map() { + if (_tri_mesh_data_map == (TriMeshDataMap *)NULL) { + _tri_mesh_data_map = new TriMeshDataMap; + } + return *_tri_mesh_data_map; +} + INLINE dTriMeshDataID OdeTriMeshData:: get_id() const { return _id; diff --git a/panda/src/ode/odeTriMeshData.cxx b/panda/src/ode/odeTriMeshData.cxx index f306dfba40..aab644a096 100755 --- a/panda/src/ode/odeTriMeshData.cxx +++ b/panda/src/ode/odeTriMeshData.cxx @@ -15,18 +15,19 @@ #include "odeTriMeshData.h" TypeHandle OdeTriMeshData::_type_handle; -OdeTriMeshData::TriMeshDataMap OdeTriMeshData::_tri_mesh_data_map; +OdeTriMeshData::TriMeshDataMap *OdeTriMeshData::_tri_mesh_data_map = NULL; void OdeTriMeshData:: link_data(dGeomID id, PT(OdeTriMeshData) data) { odetrimeshdata_cat.debug() << get_class_type() << "::link_data(" << id << "->" << data << ")" << "\n"; - _tri_mesh_data_map[id] = data; + get_tri_mesh_data_map()[id] = data; } PT(OdeTriMeshData) OdeTriMeshData:: get_data(dGeomID id) { - TriMeshDataMap::iterator iter = _tri_mesh_data_map.find(id); - if (iter != _tri_mesh_data_map.end()) { + const TriMeshDataMap &data_map = get_tri_mesh_data_map(); + TriMeshDataMap::const_iterator iter = data_map.find(id); + if (iter != data_map.end()) { return iter->second; } return 0; @@ -35,17 +36,19 @@ get_data(dGeomID id) { void OdeTriMeshData:: unlink_data(dGeomID id) { odetrimeshdata_cat.debug() << get_class_type() << "::unlink_data(" << id << ")" << "\n"; - TriMeshDataMap::iterator iter = _tri_mesh_data_map.find(id); - if (iter != _tri_mesh_data_map.end()) { - _tri_mesh_data_map.erase(iter); + nassertv(_tri_mesh_data_map != (TriMeshDataMap *)NULL); + TriMeshDataMap::iterator iter = _tri_mesh_data_map->find(id); + if (iter != _tri_mesh_data_map->end()) { + _tri_mesh_data_map->erase(iter); } } void OdeTriMeshData:: print_data(const string &marker) { - odetrimeshdata_cat.debug() << get_class_type() << "::print_data(" << marker << ")\n"; - TriMeshDataMap::iterator iter = _tri_mesh_data_map.begin(); - for (;iter != _tri_mesh_data_map.end(); ++iter) { + odetrimeshdata_cat.debug() << get_class_type() << "::print_data(" << marker << ")\n"; + const TriMeshDataMap &data_map = get_tri_mesh_data_map(); + TriMeshDataMap::const_iterator iter = data_map.begin(); + for (;iter != data_map.end(); ++iter) { odetrimeshdata_cat.debug() << "\t" << iter->first << " : " << iter->second << "\n"; } } @@ -53,21 +56,22 @@ print_data(const string &marker) { void OdeTriMeshData:: remove_data(OdeTriMeshData *data) { odetrimeshdata_cat.debug() << get_class_type() << "::remove_data(" << data->get_id() << ")" << "\n"; + nassertv(_tri_mesh_data_map != (TriMeshDataMap *)NULL); TriMeshDataMap::iterator iter; - for (iter = _tri_mesh_data_map.begin(); - iter != _tri_mesh_data_map.end(); + for (iter = _tri_mesh_data_map->begin(); + iter != _tri_mesh_data_map->end(); ++iter) { if ( iter->second == data ) { break; } } - while (iter != _tri_mesh_data_map.end()) { - _tri_mesh_data_map.erase(iter); + while (iter != _tri_mesh_data_map->end()) { + _tri_mesh_data_map->erase(iter); - for (iter = _tri_mesh_data_map.begin(); - iter != _tri_mesh_data_map.end(); + for (iter = _tri_mesh_data_map->begin(); + iter != _tri_mesh_data_map->end(); ++iter) { if ( iter->second == data ) { break; diff --git a/panda/src/ode/odeTriMeshData.h b/panda/src/ode/odeTriMeshData.h index 03900dca82..70b6eaa4dd 100755 --- a/panda/src/ode/odeTriMeshData.h +++ b/panda/src/ode/odeTriMeshData.h @@ -42,7 +42,8 @@ public: private: typedef pmap TriMeshDataMap; - static TriMeshDataMap _tri_mesh_data_map; + static TriMeshDataMap *_tri_mesh_data_map; + static INLINE TriMeshDataMap &get_tri_mesh_data_map(); PUBLISHED: