fix ode crash on exit

This commit is contained in:
David Rose 2011-04-25 19:46:13 +00:00
parent ea1d78b85e
commit ae38a4eb44
4 changed files with 36 additions and 23 deletions

View File

@ -50,12 +50,12 @@
Configure(config_ode); Configure(config_ode);
NotifyCategoryDef(ode, ""); NotifyCategoryDef(ode, "");
NotifyCategoryDef(odeworld, ""); NotifyCategoryDef(odeworld, "ode");
NotifyCategoryDef(odebody, ""); NotifyCategoryDef(odebody, "ode");
NotifyCategoryDef(odejoint, ""); NotifyCategoryDef(odejoint, "ode");
NotifyCategoryDef(odespace, ""); NotifyCategoryDef(odespace, "ode");
NotifyCategoryDef(odegeom, ""); NotifyCategoryDef(odegeom, "ode");
NotifyCategoryDef(odetrimeshdata, ""); NotifyCategoryDef(odetrimeshdata, "ode");
ConfigureFn(config_ode) { ConfigureFn(config_ode) {
init_libode(); init_libode();

View File

@ -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:: INLINE dTriMeshDataID OdeTriMeshData::
get_id() const { get_id() const {
return _id; return _id;

View File

@ -15,18 +15,19 @@
#include "odeTriMeshData.h" #include "odeTriMeshData.h"
TypeHandle OdeTriMeshData::_type_handle; TypeHandle OdeTriMeshData::_type_handle;
OdeTriMeshData::TriMeshDataMap OdeTriMeshData::_tri_mesh_data_map; OdeTriMeshData::TriMeshDataMap *OdeTriMeshData::_tri_mesh_data_map = NULL;
void OdeTriMeshData:: void OdeTriMeshData::
link_data(dGeomID id, PT(OdeTriMeshData) data) { link_data(dGeomID id, PT(OdeTriMeshData) data) {
odetrimeshdata_cat.debug() << get_class_type() << "::link_data(" << id << "->" << data << ")" << "\n"; 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:: PT(OdeTriMeshData) OdeTriMeshData::
get_data(dGeomID id) { get_data(dGeomID id) {
TriMeshDataMap::iterator iter = _tri_mesh_data_map.find(id); const TriMeshDataMap &data_map = get_tri_mesh_data_map();
if (iter != _tri_mesh_data_map.end()) { TriMeshDataMap::const_iterator iter = data_map.find(id);
if (iter != data_map.end()) {
return iter->second; return iter->second;
} }
return 0; return 0;
@ -35,17 +36,19 @@ get_data(dGeomID id) {
void OdeTriMeshData:: void OdeTriMeshData::
unlink_data(dGeomID id) { unlink_data(dGeomID id) {
odetrimeshdata_cat.debug() << get_class_type() << "::unlink_data(" << id << ")" << "\n"; odetrimeshdata_cat.debug() << get_class_type() << "::unlink_data(" << id << ")" << "\n";
TriMeshDataMap::iterator iter = _tri_mesh_data_map.find(id); nassertv(_tri_mesh_data_map != (TriMeshDataMap *)NULL);
if (iter != _tri_mesh_data_map.end()) { TriMeshDataMap::iterator iter = _tri_mesh_data_map->find(id);
_tri_mesh_data_map.erase(iter); if (iter != _tri_mesh_data_map->end()) {
_tri_mesh_data_map->erase(iter);
} }
} }
void OdeTriMeshData:: void OdeTriMeshData::
print_data(const string &marker) { print_data(const string &marker) {
odetrimeshdata_cat.debug() << get_class_type() << "::print_data(" << marker << ")\n"; odetrimeshdata_cat.debug() << get_class_type() << "::print_data(" << marker << ")\n";
TriMeshDataMap::iterator iter = _tri_mesh_data_map.begin(); const TriMeshDataMap &data_map = get_tri_mesh_data_map();
for (;iter != _tri_mesh_data_map.end(); ++iter) { TriMeshDataMap::const_iterator iter = data_map.begin();
for (;iter != data_map.end(); ++iter) {
odetrimeshdata_cat.debug() << "\t" << iter->first << " : " << iter->second << "\n"; odetrimeshdata_cat.debug() << "\t" << iter->first << " : " << iter->second << "\n";
} }
} }
@ -53,21 +56,22 @@ print_data(const string &marker) {
void OdeTriMeshData:: void OdeTriMeshData::
remove_data(OdeTriMeshData *data) { remove_data(OdeTriMeshData *data) {
odetrimeshdata_cat.debug() << get_class_type() << "::remove_data(" << data->get_id() << ")" << "\n"; odetrimeshdata_cat.debug() << get_class_type() << "::remove_data(" << data->get_id() << ")" << "\n";
nassertv(_tri_mesh_data_map != (TriMeshDataMap *)NULL);
TriMeshDataMap::iterator iter; TriMeshDataMap::iterator iter;
for (iter = _tri_mesh_data_map.begin(); for (iter = _tri_mesh_data_map->begin();
iter != _tri_mesh_data_map.end(); iter != _tri_mesh_data_map->end();
++iter) { ++iter) {
if ( iter->second == data ) { if ( iter->second == data ) {
break; break;
} }
} }
while (iter != _tri_mesh_data_map.end()) { while (iter != _tri_mesh_data_map->end()) {
_tri_mesh_data_map.erase(iter); _tri_mesh_data_map->erase(iter);
for (iter = _tri_mesh_data_map.begin(); for (iter = _tri_mesh_data_map->begin();
iter != _tri_mesh_data_map.end(); iter != _tri_mesh_data_map->end();
++iter) { ++iter) {
if ( iter->second == data ) { if ( iter->second == data ) {
break; break;

View File

@ -42,7 +42,8 @@ public:
private: private:
typedef pmap<dGeomID, PT(OdeTriMeshData)> TriMeshDataMap; typedef pmap<dGeomID, PT(OdeTriMeshData)> TriMeshDataMap;
static TriMeshDataMap _tri_mesh_data_map; static TriMeshDataMap *_tri_mesh_data_map;
static INLINE TriMeshDataMap &get_tri_mesh_data_map();
PUBLISHED: PUBLISHED: