aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/WorldSocket.cpp4
-rw-r--r--src/server/shared/Networking/Socket.h21
-rw-r--r--src/server/shared/Threading/ProducerConsumerQueue.h4
3 files changed, 6 insertions, 23 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 949e783a3ba..91164ab780e 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -81,8 +81,8 @@ void WorldSocket::Start()
initializer.Write(&header, sizeof(header.Setup.Size));
initializer.Write(ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length());
- std::unique_lock<std::mutex> dummy(_writeLock, std::defer_lock);
- QueuePacket(std::move(initializer), dummy);
+ std::unique_lock<std::mutex> guard(_writeLock);
+ QueuePacket(std::move(initializer), guard);
}
void WorldSocket::HandleSendAuthSession()
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h
index 0ac23a96224..d337e07ff52 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/server/shared/Networking/Socket.h
@@ -50,6 +50,7 @@ public:
virtual ~Socket()
{
+ _closed = true;
boost::system::error_code error;
_socket.close(error);
}
@@ -97,26 +98,6 @@ public:
std::bind(&Socket<T>::ReadHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
- void ReadData(std::size_t size)
- {
- if (!IsOpen())
- return;
-
- boost::system::error_code error;
-
- std::size_t bytesRead = boost::asio::read(_socket, boost::asio::buffer(_readBuffer.GetWritePointer(), size), error);
-
- _readBuffer.WriteCompleted(bytesRead);
-
- if (error || bytesRead != size)
- {
- TC_LOG_DEBUG("network", "Socket::ReadData: %s errored with: %i (%s)", GetRemoteIpAddress().to_string().c_str(), error.value(),
- error.message().c_str());
-
- CloseSocket();
- }
- }
-
void QueuePacket(MessageBuffer&& buffer, std::unique_lock<std::mutex>& guard)
{
_writeQueue.push(std::move(buffer));
diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/server/shared/Threading/ProducerConsumerQueue.h
index 67150a20d80..3158e3deb24 100644
--- a/src/server/shared/Threading/ProducerConsumerQueue.h
+++ b/src/server/shared/Threading/ProducerConsumerQueue.h
@@ -70,7 +70,9 @@ public:
{
std::unique_lock<std::mutex> lock(_queueLock);
- _condition.wait(lock, [this]() { return !_queue.empty() || _shutdown; });
+ // we could be using .wait(lock, predicate) overload here but some threading error analysis tools produce false positives
+ while (_queue.empty() && !_shutdown)
+ _condition.wait(lock);
if (_queue.empty() || _shutdown)
return;