diff --git a/src/driver.h b/src/driver.h --- 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 --- 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; }