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);
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();

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

View File

@ -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;

View File

@ -42,7 +42,8 @@ public:
private:
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: