more mutexes
This commit is contained in:
parent
4548841a93
commit
81a5d58d70
10 changed files with 127 additions and 7 deletions
|
@ -23,6 +23,7 @@
|
|||
#include "rng_abstract.h"
|
||||
#include <QSet>
|
||||
#include <QDebug>
|
||||
#include "server_game.h"
|
||||
|
||||
Server_CardZone::Server_CardZone(Server_Player *_player, const QString &_name, bool _has_coords, ZoneType _type)
|
||||
: player(_player), name(_name), has_coords(_has_coords), type(_type), cardsBeingLookedAt(0)
|
||||
|
@ -37,6 +38,8 @@ Server_CardZone::~Server_CardZone()
|
|||
|
||||
void Server_CardZone::shuffle()
|
||||
{
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
QList<Server_Card *> temp;
|
||||
for (int i = cards.size(); i; i--)
|
||||
temp.append(cards.takeAt(rng->getNumber(0, i - 1)));
|
||||
|
@ -45,6 +48,8 @@ void Server_CardZone::shuffle()
|
|||
|
||||
int Server_CardZone::removeCard(Server_Card *card)
|
||||
{
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
int index = cards.indexOf(card);
|
||||
cards.removeAt(index);
|
||||
return index;
|
||||
|
@ -52,6 +57,8 @@ int Server_CardZone::removeCard(Server_Card *card)
|
|||
|
||||
Server_Card *Server_CardZone::getCard(int id, bool remove, int *position)
|
||||
{
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
if (type != HiddenZone) {
|
||||
QListIterator<Server_Card *> CardIterator(cards);
|
||||
int i = 0;
|
||||
|
@ -85,6 +92,8 @@ Server_Card *Server_CardZone::getCard(int id, bool remove, int *position)
|
|||
|
||||
int Server_CardZone::getFreeGridColumn(int x, int y, const QString &cardName) const
|
||||
{
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
QMap<int, Server_Card *> coordMap;
|
||||
for (int i = 0; i < cards.size(); ++i)
|
||||
if (cards[i]->getY() == y)
|
||||
|
@ -131,6 +140,8 @@ bool Server_CardZone::isColumnStacked(int x, int y) const
|
|||
if (!has_coords)
|
||||
return false;
|
||||
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
QMap<int, Server_Card *> coordMap;
|
||||
for (int i = 0; i < cards.size(); ++i)
|
||||
if (cards[i]->getY() == y)
|
||||
|
@ -144,6 +155,8 @@ bool Server_CardZone::isColumnEmpty(int x, int y) const
|
|||
if (!has_coords)
|
||||
return true;
|
||||
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
QMap<int, Server_Card *> coordMap;
|
||||
for (int i = 0; i < cards.size(); ++i)
|
||||
if (cards[i]->getY() == y)
|
||||
|
@ -154,6 +167,8 @@ bool Server_CardZone::isColumnEmpty(int x, int y) const
|
|||
|
||||
void Server_CardZone::moveCard(CommandContainer *cont, QMap<int, Server_Card *> &coordMap, Server_Card *card, int x, int y)
|
||||
{
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
coordMap.remove(card->getY() * 10000 + card->getX());
|
||||
|
||||
CardToMove *cardToMove = new CardToMove(card->getId());
|
||||
|
@ -165,6 +180,8 @@ void Server_CardZone::moveCard(CommandContainer *cont, QMap<int, Server_Card *>
|
|||
|
||||
void Server_CardZone::fixFreeSpaces(CommandContainer *cont)
|
||||
{
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
QMap<int, Server_Card *> coordMap;
|
||||
QSet<int> placesToLook;
|
||||
for (int i = 0; i < cards.size(); ++i) {
|
||||
|
@ -194,6 +211,8 @@ void Server_CardZone::fixFreeSpaces(CommandContainer *cont)
|
|||
|
||||
void Server_CardZone::insertCard(Server_Card *card, int x, int y)
|
||||
{
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
if (hasCoords()) {
|
||||
card->setCoords(x, y);
|
||||
cards.append(card);
|
||||
|
@ -206,6 +225,8 @@ void Server_CardZone::insertCard(Server_Card *card, int x, int y)
|
|||
|
||||
void Server_CardZone::clear()
|
||||
{
|
||||
QMutexLocker locker(&player->getGame()->gameMutex);
|
||||
|
||||
for (int i = 0; i < cards.size(); i++)
|
||||
delete cards.at(i);
|
||||
cards.clear();
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include <QDebug>
|
||||
|
||||
Server_Game::Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QString &_description, const QString &_password, int _maxPlayers, const QList<int> &_gameTypes, bool _onlyBuddies, bool _onlyRegistered, bool _spectatorsAllowed, bool _spectatorsNeedPassword, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, Server_Room *parent)
|
||||
: QObject(parent), creatorInfo(new ServerInfo_User(_creator->getUserInfo())), gameStarted(false), gameId(_gameId), description(_description), password(_password), maxPlayers(_maxPlayers), gameTypes(_gameTypes), activePlayer(-1), activePhase(-1), onlyBuddies(_onlyBuddies), onlyRegistered(_onlyRegistered), spectatorsAllowed(_spectatorsAllowed), spectatorsNeedPassword(_spectatorsNeedPassword), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), inactivityCounter(0), secondsElapsed(0)
|
||||
: QObject(parent), creatorInfo(new ServerInfo_User(_creator->getUserInfo())), gameStarted(false), gameId(_gameId), description(_description), password(_password), maxPlayers(_maxPlayers), gameTypes(_gameTypes), activePlayer(-1), activePhase(-1), onlyBuddies(_onlyBuddies), onlyRegistered(_onlyRegistered), spectatorsAllowed(_spectatorsAllowed), spectatorsNeedPassword(_spectatorsNeedPassword), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), inactivityCounter(0), secondsElapsed(0), gameMutex(QMutex::Recursive)
|
||||
{
|
||||
addPlayer(_creator, false, false);
|
||||
|
||||
|
@ -42,6 +42,8 @@ Server_Game::Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QS
|
|||
|
||||
Server_Game::~Server_Game()
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
sendGameEvent(new Event_GameClosed);
|
||||
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
|
@ -56,6 +58,7 @@ Server_Game::~Server_Game()
|
|||
|
||||
void Server_Game::pingClockTimeout()
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
++secondsElapsed;
|
||||
|
||||
QList<ServerInfo_PlayerPing *> pingList;
|
||||
|
@ -83,6 +86,8 @@ void Server_Game::pingClockTimeout()
|
|||
|
||||
int Server_Game::getPlayerCount() const
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
int result = 0;
|
||||
while (playerIterator.hasNext())
|
||||
|
@ -93,6 +98,8 @@ int Server_Game::getPlayerCount() const
|
|||
|
||||
int Server_Game::getSpectatorCount() const
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
int result = 0;
|
||||
while (playerIterator.hasNext())
|
||||
|
@ -103,6 +110,8 @@ int Server_Game::getSpectatorCount() const
|
|||
|
||||
void Server_Game::startGameIfReady()
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
if (getPlayerCount() < maxPlayers)
|
||||
return;
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
|
@ -149,6 +158,8 @@ void Server_Game::startGameIfReady()
|
|||
|
||||
void Server_Game::stopGameIfFinished()
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
int playing = 0;
|
||||
while (playerIterator.hasNext()) {
|
||||
|
@ -194,6 +205,8 @@ ResponseCode Server_Game::checkJoin(ServerInfo_User *user, const QString &_passw
|
|||
|
||||
Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate)
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
const QList<int> &keyList = players.keys();
|
||||
int playerId = keyList.isEmpty() ? 0 : (keyList.last() + 1);
|
||||
|
||||
|
@ -209,6 +222,8 @@ Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spec
|
|||
|
||||
void Server_Game::removePlayer(Server_Player *player)
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
players.remove(player->getPlayerId());
|
||||
removeArrowsToPlayer(player);
|
||||
|
||||
|
@ -229,6 +244,8 @@ void Server_Game::removePlayer(Server_Player *player)
|
|||
|
||||
void Server_Game::removeArrowsToPlayer(Server_Player *player)
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
// Remove all arrows of other players pointing to the player being removed or to one of his cards.
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
while (playerIterator.hasNext()) {
|
||||
|
@ -253,6 +270,8 @@ void Server_Game::removeArrowsToPlayer(Server_Player *player)
|
|||
|
||||
bool Server_Game::kickPlayer(int playerId)
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
Server_Player *playerToKick = players.value(playerId);
|
||||
if (!playerToKick)
|
||||
return false;
|
||||
|
@ -265,6 +284,8 @@ bool Server_Game::kickPlayer(int playerId)
|
|||
|
||||
void Server_Game::setActivePlayer(int _activePlayer)
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
activePlayer = _activePlayer;
|
||||
sendGameEvent(new Event_SetActivePlayer(activePlayer, activePlayer));
|
||||
setActivePhase(0);
|
||||
|
@ -272,6 +293,8 @@ void Server_Game::setActivePlayer(int _activePlayer)
|
|||
|
||||
void Server_Game::setActivePhase(int _activePhase)
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
while (playerIterator.hasNext()) {
|
||||
Server_Player *player = playerIterator.next().value();
|
||||
|
@ -289,6 +312,8 @@ void Server_Game::setActivePhase(int _activePhase)
|
|||
|
||||
void Server_Game::nextTurn()
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
const QList<int> keys = players.keys();
|
||||
int listPos = -1;
|
||||
if (activePlayer != -1)
|
||||
|
@ -304,6 +329,8 @@ void Server_Game::nextTurn()
|
|||
|
||||
QList<ServerInfo_Player *> Server_Game::getGameState(Server_Player *playerWhosAsking) const
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
QList<ServerInfo_Player *> result;
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
while (playerIterator.hasNext()) {
|
||||
|
@ -392,6 +419,8 @@ void Server_Game::sendGameEvent(GameEvent *event, GameEventContext *context, Ser
|
|||
|
||||
void Server_Game::sendGameEventContainer(GameEventContainer *cont, Server_Player *exclude, bool excludeOmniscient)
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
cont->setGameId(gameId);
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
while (playerIterator.hasNext()) {
|
||||
|
@ -405,6 +434,8 @@ void Server_Game::sendGameEventContainer(GameEventContainer *cont, Server_Player
|
|||
|
||||
void Server_Game::sendGameEventContainerOmniscient(GameEventContainer *cont, Server_Player *exclude)
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
cont->setGameId(gameId);
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
while (playerIterator.hasNext()) {
|
||||
|
@ -423,6 +454,8 @@ void Server_Game::sendGameEventToPlayer(Server_Player *player, GameEvent *event)
|
|||
|
||||
ServerInfo_Game *Server_Game::getInfo() const
|
||||
{
|
||||
QMutexLocker locker(&gameMutex);
|
||||
|
||||
if (players.isEmpty())
|
||||
// Game is closing
|
||||
return new ServerInfo_Game(getGameId(), QString(), false, 0, getMaxPlayers(), QList<GameTypeId *>(), 0, false, 0);
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <QStringList>
|
||||
#include <QPointer>
|
||||
#include <QObject>
|
||||
#include <QMutex>
|
||||
#include "server_player.h"
|
||||
#include "protocol.h"
|
||||
|
||||
|
@ -55,6 +56,7 @@ signals:
|
|||
private slots:
|
||||
void pingClockTimeout();
|
||||
public:
|
||||
mutable QMutex gameMutex;
|
||||
Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QString &_description, const QString &_password, int _maxPlayers, const QList<int> &_gameTypes, bool _onlyBuddies, bool _onlyRegistered, bool _spectatorsAllowed, bool _spectatorsNeedPassword, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, Server_Room *parent);
|
||||
~Server_Game();
|
||||
ServerInfo_Game *getInfo() const;
|
||||
|
|
|
@ -17,6 +17,8 @@ Server_Player::Server_Player(Server_Game *_game, int _playerId, ServerInfo_User
|
|||
|
||||
Server_Player::~Server_Player()
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
delete deck;
|
||||
|
||||
if (handler)
|
||||
|
@ -28,11 +30,15 @@ Server_Player::~Server_Player()
|
|||
|
||||
int Server_Player::newCardId()
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
return nextCardId++;
|
||||
}
|
||||
|
||||
int Server_Player::newCounterId() const
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
int id = 0;
|
||||
QMapIterator<int, Server_Counter *> i(counters);
|
||||
while (i.hasNext()) {
|
||||
|
@ -45,6 +51,8 @@ int Server_Player::newCounterId() const
|
|||
|
||||
int Server_Player::newArrowId() const
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
int id = 0;
|
||||
QMapIterator<int, Server_Arrow *> i(arrows);
|
||||
while (i.hasNext()) {
|
||||
|
@ -57,6 +65,8 @@ int Server_Player::newArrowId() const
|
|||
|
||||
void Server_Player::setupZones()
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
// This may need to be customized according to the game rules.
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
|
@ -138,6 +148,8 @@ void Server_Player::setupZones()
|
|||
|
||||
void Server_Player::clearZones()
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
QMapIterator<QString, Server_CardZone *> zoneIterator(zones);
|
||||
while (zoneIterator.hasNext())
|
||||
delete zoneIterator.next().value();
|
||||
|
@ -158,11 +170,15 @@ void Server_Player::clearZones()
|
|||
|
||||
ServerInfo_PlayerProperties *Server_Player::getProperties()
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
return new ServerInfo_PlayerProperties(playerId, new ServerInfo_User(userInfo), spectator, conceded, readyStart, deckId);
|
||||
}
|
||||
|
||||
void Server_Player::setDeck(DeckList *_deck, int _deckId)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
delete deck;
|
||||
deck = _deck;
|
||||
deckId = _deckId;
|
||||
|
@ -170,16 +186,22 @@ void Server_Player::setDeck(DeckList *_deck, int _deckId)
|
|||
|
||||
void Server_Player::addZone(Server_CardZone *zone)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
zones.insert(zone->getName(), zone);
|
||||
}
|
||||
|
||||
void Server_Player::addArrow(Server_Arrow *arrow)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
arrows.insert(arrow->getId(), arrow);
|
||||
}
|
||||
|
||||
bool Server_Player::deleteArrow(int arrowId)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
Server_Arrow *arrow = arrows.value(arrowId, 0);
|
||||
if (!arrow)
|
||||
return false;
|
||||
|
@ -190,11 +212,15 @@ bool Server_Player::deleteArrow(int arrowId)
|
|||
|
||||
void Server_Player::addCounter(Server_Counter *counter)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
counters.insert(counter->getId(), counter);
|
||||
}
|
||||
|
||||
bool Server_Player::deleteCounter(int counterId)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
Server_Counter *counter = counters.value(counterId, 0);
|
||||
if (!counter)
|
||||
return false;
|
||||
|
@ -205,6 +231,8 @@ bool Server_Player::deleteCounter(int counterId)
|
|||
|
||||
ResponseCode Server_Player::drawCards(CommandContainer *cont, int number)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
Server_CardZone *deckZone = zones.value("deck");
|
||||
Server_CardZone *handZone = zones.value("hand");
|
||||
if (deckZone->cards.size() < number)
|
||||
|
@ -228,6 +256,8 @@ ResponseCode Server_Player::drawCards(CommandContainer *cont, int number)
|
|||
|
||||
ResponseCode Server_Player::undoDraw(CommandContainer *cont)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
if (lastDrawList.isEmpty())
|
||||
return RespContextError;
|
||||
|
||||
|
@ -240,6 +270,8 @@ ResponseCode Server_Player::undoDraw(CommandContainer *cont)
|
|||
|
||||
ResponseCode Server_Player::moveCard(CommandContainer *cont, const QString &_startZone, const QList<CardToMove *> &_cards, int targetPlayerId, const QString &_targetZone, int x, int y, bool faceDown)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
Server_CardZone *startzone = getZones().value(_startZone);
|
||||
Server_Player *targetPlayer = game->getPlayers().value(targetPlayerId);
|
||||
if (!targetPlayer)
|
||||
|
@ -274,6 +306,8 @@ public:
|
|||
|
||||
ResponseCode Server_Player::moveCard(CommandContainer *cont, Server_CardZone *startzone, const QList<CardToMove *> &_cards, Server_CardZone *targetzone, int x, int y, bool faceDown, bool fixFreeSpaces, bool undoingDraw)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
// Disallow controller change to other zones than the table.
|
||||
if (((targetzone->getType() != PublicZone) || !targetzone->hasCoords()) && (startzone->getPlayer() != targetzone->getPlayer()))
|
||||
return RespContextError;
|
||||
|
@ -428,6 +462,8 @@ ResponseCode Server_Player::moveCard(CommandContainer *cont, Server_CardZone *st
|
|||
|
||||
void Server_Player::unattachCard(CommandContainer *cont, Server_Card *card)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
Server_CardZone *zone = card->getZone();
|
||||
|
||||
card->setParentCard(0);
|
||||
|
@ -441,6 +477,8 @@ void Server_Player::unattachCard(CommandContainer *cont, Server_Card *card)
|
|||
|
||||
ResponseCode Server_Player::setCardAttrHelper(CommandContainer *cont, const QString &zoneName, int cardId, const QString &attrName, const QString &attrValue)
|
||||
{
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
Server_CardZone *zone = getZones().value(zoneName);
|
||||
if (!zone)
|
||||
return RespNameNotFound;
|
||||
|
@ -471,6 +509,8 @@ ResponseCode Server_Player::setCardAttrHelper(CommandContainer *cont, const QStr
|
|||
|
||||
void Server_Player::sendProtocolItem(ProtocolItem *item, bool deleteItem)
|
||||
{
|
||||
QMutexLocker locker(&playerMutex);
|
||||
|
||||
if (handler)
|
||||
handler->sendProtocolItem(item, deleteItem);
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <QString>
|
||||
#include <QList>
|
||||
#include <QMap>
|
||||
#include <QMutex>
|
||||
#include "protocol_datastructures.h"
|
||||
|
||||
class DeckList;
|
||||
|
@ -22,6 +23,7 @@ class CommandContainer;
|
|||
class Server_Player : public Server_ArrowTarget {
|
||||
Q_OBJECT
|
||||
private:
|
||||
mutable QMutex playerMutex;
|
||||
class MoveCardCompareFunctor;
|
||||
Server_Game *game;
|
||||
Server_ProtocolHandler *handler;
|
||||
|
@ -42,7 +44,7 @@ public:
|
|||
Server_Player(Server_Game *_game, int _playerId, ServerInfo_User *_userInfo, bool _spectator, Server_ProtocolHandler *_handler);
|
||||
~Server_Player();
|
||||
Server_ProtocolHandler *getProtocolHandler() const { return handler; }
|
||||
void setProtocolHandler(Server_ProtocolHandler *_handler) { handler = _handler; }
|
||||
void setProtocolHandler(Server_ProtocolHandler *_handler) { playerMutex.lock(); handler = _handler; playerMutex.unlock(); }
|
||||
|
||||
void setPlayerId(int _id) { playerId = _id; }
|
||||
int getInitialCards() const { return initialCards; }
|
||||
|
@ -57,6 +59,7 @@ public:
|
|||
ServerInfo_User *getUserInfo() const { return userInfo; }
|
||||
void setDeck(DeckList *_deck, int _deckId);
|
||||
DeckList *getDeck() const { return deck; }
|
||||
Server_Game *getGame() const { return game; }
|
||||
const QMap<QString, Server_CardZone *> &getZones() const { return zones; }
|
||||
const QMap<int, Server_Counter *> &getCounters() const { return counters; }
|
||||
const QMap<int, Server_Arrow *> &getArrows() const { return arrows; }
|
||||
|
|
|
@ -68,6 +68,8 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm
|
|||
if (!room)
|
||||
return RespNameNotFound;
|
||||
|
||||
QMutexLocker locker(&room->roomMutex);
|
||||
|
||||
switch (command->getItemId()) {
|
||||
case ItemId_Command_LeaveRoom: return cmdLeaveRoom(static_cast<Command_LeaveRoom *>(command), cont, room);
|
||||
case ItemId_Command_RoomSay: return cmdRoomSay(static_cast<Command_RoomSay *>(command), cont, room);
|
||||
|
@ -90,6 +92,8 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm
|
|||
Server_Game *game = gamePair.first;
|
||||
Server_Player *player = gamePair.second;
|
||||
|
||||
QMutexLocker locker(&game->gameMutex);
|
||||
|
||||
switch (command->getItemId()) {
|
||||
case ItemId_Command_DeckSelect: return cmdDeckSelect(static_cast<Command_DeckSelect *>(command), cont, game, player);
|
||||
case ItemId_Command_SetSideboardPlan: return cmdSetSideboardPlan(static_cast<Command_SetSideboardPlan *>(command), cont, game, player);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <QDebug>
|
||||
|
||||
Server_Room::Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent)
|
||||
: QObject(parent), id(_id), name(_name), description(_description), autoJoin(_autoJoin), joinMessage(_joinMessage), gameTypes(_gameTypes)
|
||||
: QObject(parent), id(_id), name(_name), description(_description), autoJoin(_autoJoin), joinMessage(_joinMessage), gameTypes(_gameTypes), roomMutex(QMutex::Recursive)
|
||||
{
|
||||
connect(this, SIGNAL(sigCreateGame(const QString &, const QString &, int, const QList<int> &, bool, bool, bool, bool, bool, bool, Server_ProtocolHandler *)), this, SLOT(doCreateGame(const QString &, const QString &, int, const QList<int> &, bool, bool, bool, bool, bool, bool, Server_ProtocolHandler *)));
|
||||
}
|
||||
|
@ -16,6 +16,8 @@ Server *Server_Room::getServer() const
|
|||
|
||||
ServerInfo_Room *Server_Room::getInfo(bool complete) const
|
||||
{
|
||||
QMutexLocker locker(&roomMutex);
|
||||
|
||||
QList<ServerInfo_Game *> gameList;
|
||||
QList<ServerInfo_User *> userList;
|
||||
QList<ServerInfo_GameType *> gameTypeList;
|
||||
|
@ -36,6 +38,8 @@ ServerInfo_Room *Server_Room::getInfo(bool complete) const
|
|||
|
||||
void Server_Room::addClient(Server_ProtocolHandler *client)
|
||||
{
|
||||
QMutexLocker locker(&roomMutex);
|
||||
|
||||
sendRoomEvent(new Event_JoinRoom(id, new ServerInfo_User(client->getUserInfo(), false)));
|
||||
append(client);
|
||||
emit roomInfoChanged();
|
||||
|
@ -43,6 +47,8 @@ void Server_Room::addClient(Server_ProtocolHandler *client)
|
|||
|
||||
void Server_Room::removeClient(Server_ProtocolHandler *client)
|
||||
{
|
||||
QMutexLocker locker(&roomMutex);
|
||||
|
||||
removeAt(indexOf(client));
|
||||
sendRoomEvent(new Event_LeaveRoom(id, client->getUserInfo()->getName()));
|
||||
emit roomInfoChanged();
|
||||
|
@ -55,6 +61,8 @@ void Server_Room::say(Server_ProtocolHandler *client, const QString &s)
|
|||
|
||||
void Server_Room::sendRoomEvent(RoomEvent *event)
|
||||
{
|
||||
QMutexLocker locker(&roomMutex);
|
||||
|
||||
for (int i = 0; i < size(); ++i)
|
||||
at(i)->sendProtocolItem(event, false);
|
||||
delete event;
|
||||
|
@ -62,6 +70,8 @@ void Server_Room::sendRoomEvent(RoomEvent *event)
|
|||
|
||||
void Server_Room::broadcastGameListUpdate(Server_Game *game)
|
||||
{
|
||||
QMutexLocker locker(&roomMutex);
|
||||
|
||||
Event_ListGames *event = new Event_ListGames(id, QList<ServerInfo_Game *>() << game->getInfo());
|
||||
|
||||
for (int i = 0; i < size(); i++)
|
||||
|
@ -71,6 +81,8 @@ void Server_Room::broadcastGameListUpdate(Server_Game *game)
|
|||
|
||||
void Server_Room::doCreateGame(const QString &description, const QString &password, int maxPlayers, const QList<int> &gameTypes, bool onlyBuddies, bool onlyRegistered, bool spectatorsAllowed, bool spectatorsNeedPassword, bool spectatorsCanTalk, bool spectatorsSeeEverything, Server_ProtocolHandler *creator)
|
||||
{
|
||||
QMutexLocker locker(&roomMutex);
|
||||
|
||||
Server_Game *newGame = new Server_Game(creator, static_cast<Server *>(parent())->getNextGameId(), description, password, maxPlayers, gameTypes, onlyBuddies, onlyRegistered, spectatorsAllowed, spectatorsNeedPassword, spectatorsCanTalk, spectatorsSeeEverything, this);
|
||||
games.insert(newGame->getGameId(), newGame);
|
||||
connect(newGame, SIGNAL(gameClosing()), this, SLOT(removeGame()));
|
||||
|
@ -89,6 +101,8 @@ void Server_Room::createGame(const QString &description, const QString &password
|
|||
|
||||
void Server_Room::removeGame()
|
||||
{
|
||||
QMutexLocker locker(&roomMutex);
|
||||
|
||||
Server_Game *game = static_cast<Server_Game *>(sender());
|
||||
broadcastGameListUpdate(game);
|
||||
games.remove(game->getGameId());
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <QMap>
|
||||
#include <QObject>
|
||||
#include <QStringList>
|
||||
#include <QMutex>
|
||||
|
||||
class Server_ProtocolHandler;
|
||||
class RoomEvent;
|
||||
|
@ -33,6 +34,7 @@ private slots:
|
|||
void doCreateGame(const QString &description, const QString &password, int maxPlayers, const QList<int> &_gameTypes, bool onlyBuddies, bool onlyRegistered, bool spectatorsAllowed, bool spectatorsNeedPassword, bool spectatorsCanTalk, bool spectatorsSeeEverything, Server_ProtocolHandler *creator);
|
||||
void removeGame();
|
||||
public:
|
||||
mutable QMutex roomMutex;
|
||||
Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent);
|
||||
int getId() const { return id; }
|
||||
QString getName() const { return name; }
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#include <QSocketNotifier>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QMutex>
|
||||
#include <QDateTime>
|
||||
#include <QThread>
|
||||
#ifdef Q_OS_UNIX
|
||||
|
@ -34,11 +33,11 @@ void ServerLogger::logMessage(QString message)
|
|||
if (!logFile)
|
||||
return;
|
||||
|
||||
static QMutex mutex;
|
||||
mutex.lock();
|
||||
logFileMutex.lock();
|
||||
QTextStream stream(logFile);
|
||||
stream << QDateTime::currentDateTime().toString() << " " << ((void *) QThread::currentThread()) << " " << message << "\n";
|
||||
mutex.unlock();
|
||||
stream.flush();
|
||||
logFileMutex.unlock();
|
||||
}
|
||||
|
||||
void ServerLogger::hupSignalHandler(int /*unused*/)
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define SERVER_LOGGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QMutex>
|
||||
|
||||
class QSocketNotifier;
|
||||
class QFile;
|
||||
|
@ -20,6 +21,7 @@ private:
|
|||
static int sigHupFD[2];
|
||||
QSocketNotifier *snHup;
|
||||
static QFile *logFile;
|
||||
QMutex logFileMutex;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue