diff options
Diffstat (limited to 'src/server/shared')
-rw-r--r-- | src/server/shared/Networking/Socket.h | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index a13a079ff6c..3bd30bd731b 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -42,7 +42,7 @@ class Socket : public std::enable_shared_from_this<T> public: Socket(tcp::socket&& socket, std::size_t headerSize) : _socket(std::move(socket)), _remoteAddress(_socket.remote_endpoint().address()), - _remotePort(_socket.remote_endpoint().port()), _readHeaderBuffer(), _readDataBuffer(), _closed(false) + _remotePort(_socket.remote_endpoint().port()), _readHeaderBuffer(), _readDataBuffer(), _closed(false), _closing(false) { _readHeaderBuffer.Grow(headerSize); } @@ -126,7 +126,7 @@ public: std::placeholders::_1, std::placeholders::_2)); } - bool IsOpen() const { return !_closed; } + bool IsOpen() const { return !_closed && !_closing; } virtual void CloseSocket() { @@ -140,6 +140,9 @@ public: shutdownError.value(), shutdownError.message().c_str()); } + /// Marks the socket for closing after write buffer becomes empty + void DelayedCloseSocket() { _closing = true; } + virtual bool IsHeaderReady() const { return _readHeaderBuffer.IsMessageReady(); } virtual bool IsDataReady() const { return _readDataBuffer.IsMessageReady(); } @@ -221,6 +224,8 @@ private: if (!_writeQueue.empty()) AsyncWrite(_writeQueue.front()); + else if (_closing) + CloseSocket(); } else CloseSocket(); @@ -241,6 +246,7 @@ private: MessageBuffer _readDataBuffer; std::atomic<bool> _closed; + std::atomic<bool> _closing; }; #endif // __SOCKET_H__ |