diff options
author | smatz <smatz@openttd.org> | 2008-05-08 23:26:17 +0000 |
---|---|---|
committer | smatz <smatz@openttd.org> | 2008-05-08 23:26:17 +0000 |
commit | 5e51833ee5b6ca7db5c529c894bdac2bba49fbd8 (patch) | |
tree | 628a45bcfaef9713dcc41143b5bbb8485228b100 /src | |
parent | 2ba05f898759269ba72b2ffd73aed7268e0ff56e (diff) | |
download | openttd-5e51833ee5b6ca7db5c529c894bdac2bba49fbd8.tar.xz |
(svn r13022) -Fix: driver list wasn't freed, replace by statically allocated one
Diffstat (limited to 'src')
-rw-r--r-- | src/driver.h | 20 | ||||
-rw-r--r-- | src/openttd.cpp | 34 |
2 files changed, 36 insertions, 18 deletions
diff --git a/src/driver.h b/src/driver.h index 6b8d857d3..7d1a3429c 100644 --- a/src/driver.h +++ b/src/driver.h @@ -43,7 +43,7 @@ private: static Drivers &GetDrivers() { - static Drivers &s_drivers = *new Drivers(); + static Drivers s_drivers; return s_drivers; } @@ -67,7 +67,23 @@ public: name(NULL) {} - virtual ~DriverFactoryBase() { if (this->name != NULL) GetDrivers().erase(this->name); free(this->name); } + /** Frees memory used for this->name + */ + virtual ~DriverFactoryBase() { + if (this->name == NULL) return; + GetDrivers().erase(this->name); + free(this->name); + } + + /** Shuts down all active drivers + */ + static void ShutdownDrivers() + { + for (Driver::Type dt = Driver::DT_BEGIN; dt < Driver::DT_END; dt++) { + Driver *driver = *GetActiveDriver(dt); + if (driver != NULL) driver->Stop(); + } + } static const Driver *SelectDriver(const char *name, Driver::Type type); static char *GetDriversInfo(char *p, const char *last); diff --git a/src/openttd.cpp b/src/openttd.cpp index dd3448543..c07ca1db8 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -288,8 +288,20 @@ static void InitializeDynamicVariables() } -static void UnInitializeGame() +/** Unitializes drivers, frees allocated memory, cleans pools, ... + * Generally, prepares the game for shutting down + */ +static void ShutdownGame() { + /* stop the AI */ + AI_Uninitialize(); + + IConsoleFree(); + + if (_network_available) NetworkShutDown(); // Shut down the network and close any open connections + + DriverFactoryBase::ShutdownDrivers(); + UnInitWindowSystem(); /* Uninitialize airport state machines */ @@ -310,6 +322,9 @@ static void UnInitializeGame() free((void*)_industry_sort); free(_config_file); + + /* Close all and any open filehandles */ + FioCloseAll(); } static void LoadIntroGame() @@ -623,13 +638,6 @@ int ttd_main(int argc, char *argv[]) _video_driver->MainLoop(); WaitTillSaved(); - IConsoleFree(); - - if (_network_available) NetworkShutDown(); // Shut down the network and close any open connections - - _video_driver->Stop(); - _music_driver->Stop(); - _sound_driver->Stop(); /* only save config if we have to */ if (save_config) { @@ -637,14 +645,8 @@ int ttd_main(int argc, char *argv[]) SaveToHighScore(); } - /* Reset windowing system and free config file */ - UnInitializeGame(); - - /* stop the AI */ - AI_Uninitialize(); - - /* Close all and any open filehandles */ - FioCloseAll(); + /* Reset windowing system, stop drivers, free used memory, ... */ + ShutdownGame(); return 0; } |