From 8d596619e7c7d650cdd936a355c0fb4822bf23d1 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 26 Jan 2013 16:34:24 +0100 Subject: [PATCH] server deadlock fix --- servatrice/src/serversocketinterface.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index db27a563..a33e8dcf 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -189,7 +189,8 @@ void ServerSocketInterface::flushOutputQueue() int totalBytes = 0; while (!outputQueue.isEmpty()) { - const ServerMessage &item = outputQueue.first(); + ServerMessage item = outputQueue.takeFirst(); + locker.unlock(); QByteArray buf; unsigned int size = item.ByteSize(); @@ -199,10 +200,11 @@ void ServerSocketInterface::flushOutputQueue() buf.data()[2] = (unsigned char) (size >> 8); buf.data()[1] = (unsigned char) (size >> 16); buf.data()[0] = (unsigned char) (size >> 24); + // In case socket->write() calls catchSocketError(), the mutex must not be locked during this call. socket->write(buf); totalBytes += size + 4; - outputQueue.removeFirst(); + locker.relock(); } servatrice->incTxBytes(totalBytes); socket->flush();