From eca941201d8c08904fbe9aac2a2b0e6f21327e85 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 22 Mar 2011 22:46:15 +0100 Subject: [PATCH] more mutexes --- cockatrice/src/localserverinterface.cpp | 1 + common/server.cpp | 7 +++++++ common/server_protocolhandler.cpp | 4 ---- servatrice/src/servatrice.cpp | 3 +++ servatrice/src/serversocketinterface.cpp | 5 +++++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cockatrice/src/localserverinterface.cpp b/cockatrice/src/localserverinterface.cpp index b4e0918d..c4d41379 100644 --- a/cockatrice/src/localserverinterface.cpp +++ b/cockatrice/src/localserverinterface.cpp @@ -9,6 +9,7 @@ LocalServerInterface::LocalServerInterface(LocalServer *_server) LocalServerInterface::~LocalServerInterface() { + server->removeClient(this); } void LocalServerInterface::sendProtocolItem(ProtocolItem *item, bool deleteItem) diff --git a/common/server.cpp b/common/server.cpp index ab5ca8b5..b48e8f93 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -38,6 +38,7 @@ Server::~Server() AuthenticationResult Server::loginUser(Server_ProtocolHandler *session, QString &name, const QString &password) { + QMutexLocker locker(&serverMutex); if (name.size() > 35) name = name.left(35); AuthenticationResult authState = checkUserPassword(name, password); @@ -78,11 +79,13 @@ AuthenticationResult Server::loginUser(Server_ProtocolHandler *session, QString void Server::addClient(Server_ProtocolHandler *client) { + QMutexLocker locker(&serverMutex); clients << client; } void Server::removeClient(Server_ProtocolHandler *client) { + QMutexLocker locker(&serverMutex); clients.removeAt(clients.indexOf(client)); ServerInfo_User *data = client->getUserInfo(); if (data) { @@ -104,6 +107,7 @@ Server_Game *Server::getGame(int gameId) const void Server::broadcastRoomUpdate() { + QMutexLocker locker(&serverMutex); Server_Room *room = static_cast(sender()); QList eventRoomList; eventRoomList.append(new ServerInfo_Room(room->getId(), room->getName(), room->getDescription(), room->getGames().size(), room->size(), room->getAutoJoin())); @@ -117,17 +121,20 @@ void Server::broadcastRoomUpdate() void Server::gameCreated(Server_Game *game) { + QMutexLocker locker(&serverMutex); games.insert(game->getGameId(), game); } void Server::gameClosing(int gameId) { + QMutexLocker locker(&serverMutex); qDebug("Server::gameClosing"); games.remove(gameId); } void Server::addRoom(Server_Room *newRoom) { + QMutexLocker locker(&serverMutex); rooms.insert(newRoom->getId(), newRoom); connect(newRoom, SIGNAL(roomInfoChanged()), this, SLOT(broadcastRoomUpdate())); connect(newRoom, SIGNAL(gameCreated(Server_Game *)), this, SLOT(gameCreated(Server_Game *))); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 6aa78e03..e0351a3a 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -22,10 +22,6 @@ Server_ProtocolHandler::Server_ProtocolHandler(Server *_server, QObject *parent) Server_ProtocolHandler::~Server_ProtocolHandler() { - // The socket has to be removed from the server's list before it is removed from the game's list - // so it will not receive the game update event. - server->removeClient(this); - QMapIterator roomIterator(rooms); while (roomIterator.hasNext()) roomIterator.next().value()->removeClient(this); diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 511525c2..c7bbd717 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -249,6 +249,7 @@ ServerInfo_User *Servatrice::getUserData(const QString &name) int Servatrice::getUsersWithAddress(const QHostAddress &address) const { + QMutexLocker locker(&serverMutex); int result = 0; for (int i = 0; i < clients.size(); ++i) if (static_cast(clients[i])->getPeerAddress() == address) @@ -304,6 +305,7 @@ QMap Servatrice::getIgnoreList(const QString &name) bool Servatrice::getUserBanned(Server_ProtocolHandler *client, const QString &userName) const { + QMutexLocker locker(&serverMutex); QHostAddress address = static_cast(client)->getPeerAddress(); for (int i = 0; i < addressBanList.size(); ++i) if (address == addressBanList[i].first) @@ -316,6 +318,7 @@ bool Servatrice::getUserBanned(Server_ProtocolHandler *client, const QString &us void Servatrice::updateBanTimer() { + QMutexLocker locker(&serverMutex); for (int i = 0; i < addressBanList.size(); ) if (--(addressBanList[i].second) <= 0) addressBanList.removeAt(i); diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 9b2e2160..d0036265 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -58,12 +58,17 @@ ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_s ServerSocketInterface::~ServerSocketInterface() { + QMutexLocker locker(&servatrice->serverMutex); logger->logMessage("ServerSocketInterface destructor"); flushXmlBuffer(); delete xmlWriter; delete xmlReader; delete socket; + socket = 0; + + // This call has to stay here so that the mutex is not freed prematurely. + server->removeClient(this); } void ServerSocketInterface::processProtocolItem(ProtocolItem *item)