aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/shared')
-rw-r--r--src/server/shared/Networking/Socket.h10
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__