Don't try to open runway and parking files for every airport in the
database. Works fine on Linux, but is a huge performance hit (1 minute) on cygwin. Keep a cache of actual directories and check that first.
This commit is contained in:
parent
b71b3af66c
commit
88c73d0ece
2 changed files with 28 additions and 3 deletions
|
@ -1149,6 +1149,26 @@ void FGAirport::chooseRunwayFallback(string *runway)
|
||||||
* FGAirportList
|
* FGAirportList
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
// Populates a list of subdirectories of $FG_ROOT/Airports/AI so that
|
||||||
|
// the add() method doesn't have to try opening 2 XML files in each of
|
||||||
|
// thousands of non-existent directories. FIXME: should probably add
|
||||||
|
// code to free this list after parsing of apt.dat is finished;
|
||||||
|
// non-issue at the moment, however, as there are no AI subdirectories
|
||||||
|
// in the base package.
|
||||||
|
FGAirportList::FGAirportList()
|
||||||
|
{
|
||||||
|
ulDir* d;
|
||||||
|
ulDirEnt* dent;
|
||||||
|
SGPath aid( globals->get_fg_root() );
|
||||||
|
aid.append( "/Airports/AI" );
|
||||||
|
if((d = ulOpenDir(aid.c_str())) == NULL)
|
||||||
|
return;
|
||||||
|
while((dent = ulReadDir(d)) != NULL) {
|
||||||
|
cerr << "Dent: " << dent->d_name; // DEBUG
|
||||||
|
ai_dirs.insert(dent->d_name);
|
||||||
|
}
|
||||||
|
ulCloseDir(d);
|
||||||
|
}
|
||||||
|
|
||||||
// add an entry to the list
|
// add an entry to the list
|
||||||
void FGAirportList::add( const string id, const double longitude,
|
void FGAirportList::add( const string id, const double longitude,
|
||||||
|
@ -1172,7 +1192,8 @@ void FGAirportList::add( const string id, const double longitude,
|
||||||
rwyPrefPath.append( "/Airports/AI/" );
|
rwyPrefPath.append( "/Airports/AI/" );
|
||||||
rwyPrefPath.append(id);
|
rwyPrefPath.append(id);
|
||||||
rwyPrefPath.append("rwyuse.xml");
|
rwyPrefPath.append("rwyuse.xml");
|
||||||
if (parkpath.exists())
|
if (ai_dirs.find(parkpath.str()) != ai_dirs.end()
|
||||||
|
&& parkpath.exists())
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
readXML(parkpath.str(),a);
|
readXML(parkpath.str(),a);
|
||||||
|
@ -1181,7 +1202,8 @@ void FGAirportList::add( const string id, const double longitude,
|
||||||
//cerr << "unable to read " << parkpath.str() << endl;
|
//cerr << "unable to read " << parkpath.str() << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rwyPrefPath.exists())
|
if (ai_dirs.find(rwyPrefPath.str()) != ai_dirs.end()
|
||||||
|
&& rwyPrefPath.exists())
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
readXML(rwyPrefPath.str(), rwyPrefs);
|
readXML(rwyPrefPath.str(), rwyPrefs);
|
||||||
|
|
|
@ -42,10 +42,12 @@
|
||||||
|
|
||||||
#include STL_STRING
|
#include STL_STRING
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
SG_USING_STD(string);
|
SG_USING_STD(string);
|
||||||
SG_USING_STD(map);
|
SG_USING_STD(map);
|
||||||
|
SG_USING_STD(set);
|
||||||
SG_USING_STD(vector);
|
SG_USING_STD(vector);
|
||||||
|
|
||||||
typedef vector<string> stringVec;
|
typedef vector<string> stringVec;
|
||||||
|
@ -306,11 +308,12 @@ private:
|
||||||
|
|
||||||
airport_map airports_by_id;
|
airport_map airports_by_id;
|
||||||
airport_list airports_array;
|
airport_list airports_array;
|
||||||
|
set < string > ai_dirs;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor (new)
|
// Constructor (new)
|
||||||
FGAirportList() {}
|
FGAirportList();
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~FGAirportList();
|
~FGAirportList();
|
||||||
|
|
Loading…
Reference in a new issue