1
0
Fork 0

Don't use the this pointer for referencing the AIModels anymore, this

turns out to get problematic on 64-bit systems. Instead use a regular
int based approach.
This commit is contained in:
ehofman 2005-10-15 14:55:51 +00:00
parent 54a33c3899
commit 5c0dbf7b65
8 changed files with 30 additions and 20 deletions

View file

@ -50,10 +50,11 @@ const double FGAIBase::lbs_to_slugs = 0.031080950172; //conversion factor
FGAIBase::FGAIBase() FGAIBase::FGAIBase()
: fp( NULL ), : fp( NULL ),
model( NULL ), model( NULL ),
props( NULL ), props( NULL ),
manager( NULL ) manager( NULL ),
_refID( _newAIModelID() )
{ {
_type_str = "model"; _type_str = "model";
tgt_heading = tgt_altitude = tgt_speed = 0.0; tgt_heading = tgt_altitude = tgt_speed = 0.0;
@ -179,7 +180,7 @@ bool FGAIBase::isa( object_type otype ) {
void FGAIBase::bind() { void FGAIBase::bind() {
props->tie("id", SGRawValueMethods<FGAIBase,int>(*this, props->tie("id", SGRawValueMethods<FGAIBase,int>(*this,
&FGAIBase::_getID)); &FGAIBase::getID));
props->tie("velocities/true-airspeed-kt", SGRawValuePointer<double>(&speed)); props->tie("velocities/true-airspeed-kt", SGRawValuePointer<double>(&speed));
props->tie("velocities/vertical-speed-fps", props->tie("velocities/vertical-speed-fps",
SGRawValueMethods<FGAIBase,double>(*this, SGRawValueMethods<FGAIBase,double>(*this,
@ -399,8 +400,8 @@ bool FGAIBase::_isNight() {
return (fgGetFloat("/sim/time/sun-angle-rad") > 1.57); return (fgGetFloat("/sim/time/sun-angle-rad") > 1.57);
} }
int FGAIBase::_getID() const { int FGAIBase::getID() const {
return (int)(this); return _refID;
} }
void FGAIBase::CalculateMach() { void FGAIBase::CalculateMach() {
@ -438,3 +439,9 @@ void FGAIBase::CalculateMach() {
// cout << "Speed(ft/s) "<< speed <<" Altitude(ft) "<< altitude << " Mach " << Mach; // cout << "Speed(ft/s) "<< speed <<" Altitude(ft) "<< altitude << " Mach " << Mach;
} }
int FGAIBase::_newAIModelID() {
static int id = 0;
if (!++id) id++; // id = 0 is not allowed.
return id;
}

View file

@ -36,6 +36,7 @@ SG_USING_STD(list);
class FGAIManager; class FGAIManager;
class FGAIFlightPlan; class FGAIFlightPlan;
struct ParkPosition { struct ParkPosition {
ParkPosition(const ParkPosition& pp) ParkPosition(const ParkPosition& pp)
: name(pp.name), offset(pp.offset), heading_deg(pp.heading_deg) : name(pp.name), offset(pp.offset), heading_deg(pp.heading_deg)
@ -129,8 +130,8 @@ public:
void setYoffset( double y_offset ); void setYoffset( double y_offset );
void setZoffset( double z_offset ); void setZoffset( double z_offset );
int getID() const;
void* getID();
void setDie( bool die ); void setDie( bool die );
bool getDie(); bool getDie();
@ -194,6 +195,11 @@ protected:
object_type _otype; object_type _otype;
int index; int index;
static int _newAIModelID();
private:
const int _refID;
public: public:
object_type getType(); object_type getType();
@ -229,8 +235,6 @@ public:
static const double e; static const double e;
static const double lbs_to_slugs; static const double lbs_to_slugs;
int _getID() const;
inline double _getRange() { return range; }; inline double _getRange() { return range; };
ssgBranch * load3DModel(const string& fg_root, ssgBranch * load3DModel(const string& fg_root,
const string &path, const string &path,
@ -279,8 +283,6 @@ inline bool FGAIBase::getDie() { return delete_me; }
inline FGAIBase::object_type FGAIBase::getType() { return _otype; } inline FGAIBase::object_type FGAIBase::getType() { return _otype; }
inline void* FGAIBase::getID() { return this; }
#endif // _FG_AIBASE_HXX #endif // _FG_AIBASE_HXX

View file

@ -352,7 +352,7 @@ FGAIManager::createStatic( FGAIModelEntity *entity ) {
return ai_static; return ai_static;
} }
void FGAIManager::destroyObject( void* ID ) { void FGAIManager::destroyObject( int ID ) {
ai_list_iterator ai_list_itr = ai_list.begin(); ai_list_iterator ai_list_itr = ai_list.begin();
while(ai_list_itr != ai_list.end()) { while(ai_list_itr != ai_list.end()) {
if ((*ai_list_itr)->getID() == ID) { if ((*ai_list_itr)->getID() == ID) {

View file

@ -90,7 +90,7 @@ public:
void* createCarrier( FGAIModelEntity *entity ); void* createCarrier( FGAIModelEntity *entity );
void* createStatic( FGAIModelEntity *entity ); void* createStatic( FGAIModelEntity *entity );
void destroyObject( void* ID ); void destroyObject( int ID );
inline double get_user_latitude() { return user_latitude; } inline double get_user_latitude() { return user_latitude; }
inline double get_user_longitude() { return user_longitude; } inline double get_user_longitude() { return user_longitude; }

View file

@ -367,7 +367,8 @@ bool FGAISchedule::update(time_t now)
// Fixme: A non-existent model path results in an // Fixme: A non-existent model path results in an
// abort, due to an unhandled exeption, in fg main loop. // abort, due to an unhandled exeption, in fg main loop.
AIManagerRef = aimgr->createAircraft( &entity, this); FGAIBase *aircraft = (FGAIBase*)aimgr->createAircraft( &entity, this);
AIManagerRef = aircraft->getID();
//cerr << "Class: " << m_class << ". acType: " << acType << ". Airline: " << airline << ". Speed = " << speed << ". From " << dep->getId() << " to " << arr->getId() << ". Time Fraction = " << (remainingTimeEnroute/(double) totalTimeEnroute) << endl; //cerr << "Class: " << m_class << ". acType: " << acType << ". Airline: " << airline << ". Speed = " << speed << ". From " << dep->getId() << " to " << arr->getId() << ". Time Fraction = " << (remainingTimeEnroute/(double) totalTimeEnroute) << endl;
//cerr << "Latitude : " << lat << ". Longitude : " << lon << endl; //cerr << "Latitude : " << lat << ". Longitude : " << lon << endl;
//cerr << "Dep : " << dep->getLatitude()<< ", "<< dep->getLongitude() << endl; //cerr << "Dep : " << dep->getLatitude()<< ", "<< dep->getLongitude() << endl;

View file

@ -49,7 +49,7 @@ class FGAISchedule
double radius; double radius;
double groundOffset; double groundOffset;
double distanceToUser; double distanceToUser;
void* AIManagerRef; int AIManagerRef;
bool firstRun; bool firstRun;

View file

@ -116,12 +116,12 @@ void FGTrafficManager::update(double something)
currAircraft++; currAircraft++;
} }
void FGTrafficManager::release(void *id) void FGTrafficManager::release(int id)
{ {
releaseList.push_back(id); releaseList.push_back(id);
} }
bool FGTrafficManager::isReleased(void *id) bool FGTrafficManager::isReleased(int id)
{ {
IdListIterator i = releaseList.begin(); IdListIterator i = releaseList.begin();
while (i != releaseList.end()) while (i != releaseList.end())

View file

@ -34,8 +34,8 @@
#include "Schedule.hxx" #include "Schedule.hxx"
typedef vector<void *> IdList; typedef vector<int> IdList;
typedef vector<void *>::iterator IdListIterator; typedef vector<int>::iterator IdListIterator;
class FGTrafficManager : public SGSubsystem, public XMLVisitor class FGTrafficManager : public SGSubsystem, public XMLVisitor
@ -61,8 +61,8 @@ public:
void init(); void init();
void update(double time); void update(double time);
void release(void *ref); void release(int ref);
bool isReleased(void *id); bool isReleased(int id);
// Some overloaded virtual XMLVisitor members // Some overloaded virtual XMLVisitor members
virtual void startXML (); virtual void startXML ();