aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Networking
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-04-11 01:55:45 +0200
committerShauren <shauren.trinity@gmail.com>2015-04-11 01:55:45 +0200
commit5659db6f03dfbb081608f6d202e62d29d239f4ea (patch)
treed236003abae4688fa6092fec1e613cfb01e41967 /src/server/shared/Networking
parent4ced9a44807de77c542cdd1dde8f75a4eb8cdc1b (diff)
Core/Bnet: Fixed crash on shutdown happening when there were still players connected
Diffstat (limited to 'src/server/shared/Networking')
-rw-r--r--src/server/shared/Networking/AsyncAcceptor.h18
-rw-r--r--src/server/shared/Networking/NetworkThread.h2
-rw-r--r--src/server/shared/Networking/SocketMgr.h11
3 files changed, 26 insertions, 5 deletions
diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h
index d22d553965b..2c50a38dd59 100644
--- a/src/server/shared/Networking/AsyncAcceptor.h
+++ b/src/server/shared/Networking/AsyncAcceptor.h
@@ -30,7 +30,7 @@ public:
AsyncAcceptor(boost::asio::io_service& ioService, std::string const& bindIp, uint16 port) :
_acceptor(ioService, tcp::endpoint(boost::asio::ip::address::from_string(bindIp), port)),
- _socket(ioService)
+ _socket(ioService), _closed(false)
{
}
@@ -55,13 +55,24 @@ public:
}
}
- AsyncAcceptManaged(mgrHandler);
+ if (!_closed)
+ AsyncAcceptManaged(mgrHandler);
});
}
+ void Close()
+ {
+ if (_closed.exchange(true))
+ return;
+
+ boost::system::error_code err;
+ _acceptor.close(err);
+ }
+
private:
tcp::acceptor _acceptor;
tcp::socket _socket;
+ std::atomic<bool> _closed;
};
template<class T>
@@ -83,7 +94,8 @@ void AsyncAcceptor::AsyncAccept()
}
// lets slap some more this-> on this so we can fix this bug with gcc 4.7.2 throwing internals in yo face
- this->AsyncAccept<T>();
+ if (!_closed)
+ this->AsyncAccept<T>();
});
}
diff --git a/src/server/shared/Networking/NetworkThread.h b/src/server/shared/Networking/NetworkThread.h
index 05ca99ea6a6..219bcb07fbb 100644
--- a/src/server/shared/Networking/NetworkThread.h
+++ b/src/server/shared/Networking/NetworkThread.h
@@ -147,6 +147,8 @@ protected:
}
TC_LOG_DEBUG("misc", "Network Thread exits");
+ _newSockets.clear();
+ _Sockets.clear();
}
private:
diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h
index e18a2077288..c7689ec8395 100644
--- a/src/server/shared/Networking/SocketMgr.h
+++ b/src/server/shared/Networking/SocketMgr.h
@@ -33,8 +33,7 @@ class SocketMgr
public:
virtual ~SocketMgr()
{
- delete _acceptor;
- delete[] _threads;
+ ASSERT(!_threads && !_acceptor && !_threadCount, "StopNetwork must be called prior to SocketMgr destruction");
}
virtual bool StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port)
@@ -69,11 +68,19 @@ public:
virtual void StopNetwork()
{
+ _acceptor->Close();
+
if (_threadCount != 0)
for (int32 i = 0; i < _threadCount; ++i)
_threads[i].Stop();
Wait();
+
+ delete _acceptor;
+ _acceptor = nullptr;
+ delete[] _threads;
+ _threads = nullptr;
+ _threadCount = 0;
}
void Wait()