(svn r13022) -Fix: driver list wasn't freed, replace by statically allocated one
--- a/src/driver.h Thu May 08 22:53:49 2008 +0000
+++ b/src/driver.h Thu May 08 23:26:17 2008 +0000
@@ -43,7 +43,7 @@
static Drivers &GetDrivers()
{
- static Drivers &s_drivers = *new Drivers();
+ static Drivers s_drivers;
return s_drivers;
}
@@ -67,7 +67,23 @@
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);
--- a/src/openttd.cpp Thu May 08 22:53:49 2008 +0000
+++ b/src/openttd.cpp Thu May 08 23:26:17 2008 +0000
@@ -288,8 +288,20 @@
}
-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 @@
free((void*)_industry_sort);
free(_config_file);
+
+ /* Close all and any open filehandles */
+ FioCloseAll();
}
static void LoadIntroGame()
@@ -623,13 +638,6 @@
_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 @@
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;
}