diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-04-11 01:55:45 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2015-04-11 01:55:45 +0200 |
| commit | 5659db6f03dfbb081608f6d202e62d29d239f4ea (patch) | |
| tree | d236003abae4688fa6092fec1e613cfb01e41967 /src/server/shared/Networking | |
| parent | 4ced9a44807de77c542cdd1dde8f75a4eb8cdc1b (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.h | 18 | ||||
| -rw-r--r-- | src/server/shared/Networking/NetworkThread.h | 2 | ||||
| -rw-r--r-- | src/server/shared/Networking/SocketMgr.h | 11 |
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() |
