LocalServer crash fix

This commit is contained in:
Max-Wilhelm Bruker 2011-05-08 17:56:52 +02:00
parent 5fa2f019d0
commit 461a62e0c8
7 changed files with 28 additions and 0 deletions

View file

@ -10,6 +10,7 @@ LocalServer::LocalServer(QObject *parent)
LocalServer::~LocalServer() LocalServer::~LocalServer()
{ {
prepareDestroy();
} }
LocalServerInterface *LocalServer::newConnection() LocalServerInterface *LocalServer::newConnection()

View file

@ -32,8 +32,18 @@ Server::Server(QObject *parent)
Server::~Server() Server::~Server()
{ {
}
void Server::prepareDestroy()
{
QMutexLocker locker(&serverMutex);
while (!clients.isEmpty()) while (!clients.isEmpty())
delete clients.takeFirst(); delete clients.takeFirst();
QMapIterator<int, Server_Room *> roomIterator(rooms);
while (roomIterator.hasNext())
delete roomIterator.next().value();
} }
AuthenticationResult Server::loginUser(Server_ProtocolHandler *session, QString &name, const QString &password) AuthenticationResult Server::loginUser(Server_ProtocolHandler *session, QString &name, const QString &password)

View file

@ -45,6 +45,7 @@ public:
virtual QMap<QString, ServerInfo_User *> getIgnoreList(const QString &name) = 0; virtual QMap<QString, ServerInfo_User *> getIgnoreList(const QString &name) = 0;
virtual bool getUserBanned(Server_ProtocolHandler * /*client*/, const QString & /*userName*/) const { return false; } virtual bool getUserBanned(Server_ProtocolHandler * /*client*/, const QString & /*userName*/) const { return false; }
protected: protected:
void prepareDestroy();
QList<Server_ProtocolHandler *> clients; QList<Server_ProtocolHandler *> clients;
QMap<QString, Server_ProtocolHandler *> users; QMap<QString, Server_ProtocolHandler *> users;
QMap<int, Server_Room *> rooms; QMap<int, Server_Room *> rooms;

View file

@ -29,6 +29,7 @@ Server_ProtocolHandler::~Server_ProtocolHandler()
void Server_ProtocolHandler::prepareDestroy() void Server_ProtocolHandler::prepareDestroy()
{ {
QMutexLocker locker(&server->serverMutex); QMutexLocker locker(&server->serverMutex);
qDebug("Server_ProtocolHandler::prepareDestroy");
server->removeClient(this); server->removeClient(this);

View file

@ -8,6 +8,19 @@ Server_Room::Server_Room(int _id, const QString &_name, const QString &_descript
{ {
} }
Server_Room::~Server_Room()
{
QMutexLocker locker(&roomMutex);
qDebug("Server_Room destructor");
const QList<Server_Game *> gameList = games.values();
for (int i = 0; i < gameList.size(); ++i)
delete gameList[i];
games.clear();
clear();
}
Server *Server_Room::getServer() const Server *Server_Room::getServer() const
{ {
return static_cast<Server *>(parent()); return static_cast<Server *>(parent());

View file

@ -29,6 +29,7 @@ private:
public: public:
mutable QMutex roomMutex; mutable QMutex roomMutex;
Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent); Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent);
~Server_Room();
int getId() const { return id; } int getId() const { return id; }
QString getName() const { return name; } QString getName() const { return name; }
QString getDescription() const { return description; } QString getDescription() const { return description; }

View file

@ -107,6 +107,7 @@ Servatrice::Servatrice(QSettings *_settings, QObject *parent)
Servatrice::~Servatrice() Servatrice::~Servatrice()
{ {
prepareDestroy();
} }
bool Servatrice::openDatabase() bool Servatrice::openDatabase()