mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-12 17:14:52 -07:00
removed recursive lock in server; moved object serialisation to worker thread
This commit is contained in:
parent
e7fc3b59a7
commit
43d7cf6a1a
6 changed files with 52 additions and 38 deletions
|
|
@ -36,7 +36,7 @@
|
|||
#include <QDebug>
|
||||
|
||||
Server::Server(bool _threaded, QObject *parent)
|
||||
: QObject(parent), threaded(_threaded), clientsLock(QReadWriteLock::Recursive), nextLocalGameId(0)
|
||||
: QObject(parent), threaded(_threaded), nextLocalGameId(0)
|
||||
{
|
||||
qRegisterMetaType<ServerInfo_Game>("ServerInfo_Game");
|
||||
qRegisterMetaType<ServerInfo_Room>("ServerInfo_Room");
|
||||
|
|
@ -79,10 +79,9 @@ void Server::prepareDestroy()
|
|||
clientsLock.unlock();
|
||||
} while (!done);
|
||||
} else {
|
||||
clientsLock.lockForWrite();
|
||||
// no locking is needed in unthreaded mode
|
||||
while (!clients.isEmpty())
|
||||
clients.first()->prepareDestroy();
|
||||
clientsLock.unlock();
|
||||
}
|
||||
|
||||
roomsLock.lockForWrite();
|
||||
|
|
@ -224,7 +223,7 @@ void Server::removeClient(Server_ProtocolHandler *client)
|
|||
void Server::externalUserJoined(const ServerInfo_User &userInfo)
|
||||
{
|
||||
// This function is always called from the main thread via signal/slot.
|
||||
QWriteLocker locker(&clientsLock);
|
||||
clientsLock.lockForWrite();
|
||||
|
||||
Server_RemoteUserInterface *newUser = new Server_RemoteUserInterface(this, ServerInfo_User_Container(userInfo));
|
||||
externalUsers.insert(QString::fromStdString(userInfo.name()), newUser);
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ public:
|
|||
mutable QReadWriteLock clientsLock, roomsLock; // locking order: roomsLock before clientsLock
|
||||
Server(bool _threaded, QObject *parent = 0);
|
||||
~Server();
|
||||
void setThreaded(bool _threaded) { threaded = _threaded; }
|
||||
AuthenticationResult loginUser(Server_ProtocolHandler *session, QString &name, const QString &password, QString &reason, int &secondsLeft);
|
||||
const QMap<int, Server_Room *> &getRooms() { return rooms; }
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@ Server_ProtocolHandler::~Server_ProtocolHandler()
|
|||
{
|
||||
}
|
||||
|
||||
// This function must only be called from the thread this object lives in.
|
||||
// The thread must not hold any server locks when calling this (e.g. clientsLock, roomsLock).
|
||||
void Server_ProtocolHandler::prepareDestroy()
|
||||
{
|
||||
if (deleted)
|
||||
|
|
@ -399,6 +401,8 @@ Response::ResponseCode Server_ProtocolHandler::cmdGetGamesOfUser(const Command_G
|
|||
if (authState == NotLoggedIn)
|
||||
return Response::RespLoginNeeded;
|
||||
|
||||
// XXX This does not take external users into account.
|
||||
// XXX Maybe remove this check and test if the result list is empty at the end.
|
||||
server->clientsLock.lockForRead();
|
||||
if (!server->getUsers().contains(QString::fromStdString(cmd.user_name())))
|
||||
return Response::RespNameNotFound;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue