diff options
author | rubidium <rubidium@openttd.org> | 2011-02-11 23:20:35 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2011-02-11 23:20:35 +0000 |
commit | d8cada7563228809936c0a2b21c5c098848636eb (patch) | |
tree | 333bca95298c90933452c0036a4d09c5e832cd58 /src/network/network_server.cpp | |
parent | 1dc5ba22105bc12ab13e79f3a8a22952d82f7c8e (diff) | |
download | openttd-d8cada7563228809936c0a2b21c5c098848636eb.tar.xz |
(svn r22064) -Fix [FS#4497] (r21399): crash when disconnecting and reconnecting while the server is still saving the savegame
Diffstat (limited to 'src/network/network_server.cpp')
-rw-r--r-- | src/network/network_server.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index be27d75a6..ffd295008 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -69,7 +69,6 @@ struct PacketWriter : SaveFilter { /** Make sure everything is cleaned up. */ ~PacketWriter() { - /* Prevent double frees. */ if (this->cs != NULL) { if (this->cs->savegame_mutex != NULL) this->cs->savegame_mutex->BeginCritical(); @@ -99,7 +98,8 @@ struct PacketWriter : SaveFilter { /* virtual */ void Write(byte *buf, size_t size) { - if (this->cs == NULL) return; + /* We want to abort the saving when the socket is closed. */ + if (this->cs == NULL) SlError(STR_NETWORK_ERROR_LOSTCONNECTION); if (this->current == NULL) this->current = new Packet(PACKET_SERVER_MAP_DATA); @@ -125,7 +125,8 @@ struct PacketWriter : SaveFilter { /* virtual */ void Finish() { - if (this->cs == NULL) return; + /* We want to abort the saving when the socket is closed. */ + if (this->cs == NULL) SlError(STR_NETWORK_ERROR_LOSTCONNECTION); if (this->cs->savegame_mutex != NULL) this->cs->savegame_mutex->BeginCritical(); @@ -181,6 +182,10 @@ ServerNetworkGameSocketHandler::~ServerNetworkGameSocketHandler() if (this->savegame != NULL) this->savegame->cs = NULL; if (this->savegame_mutex != NULL) this->savegame_mutex->EndCritical(); + + /* Make sure the saving is completely cancelled. */ + if (this->savegame != NULL) WaitTillSaved(); + delete this->savegame_mutex; } |