mirror of
https://github.com/glest/glest-source.git
synced 2025-02-25 20:22:31 +01:00
- added safe mutex wrapper class
This commit is contained in:
parent
bab0e87141
commit
ace1cef8a8
@ -56,9 +56,9 @@ void ConnectionSlotThread::signalUpdate(ConnectionSlotEvent *event) {
|
|||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
if(event != NULL) {
|
if(event != NULL) {
|
||||||
triggerIdMutex.p();
|
MutexSafeWrapper safeMutex(&triggerIdMutex);
|
||||||
this->event = event;
|
this->event = event;
|
||||||
triggerIdMutex.v();
|
safeMutex.ReleaseLock();
|
||||||
}
|
}
|
||||||
semTaskSignalled.signal();
|
semTaskSignalled.signal();
|
||||||
|
|
||||||
@ -69,9 +69,9 @@ void ConnectionSlotThread::setTaskCompleted(ConnectionSlotEvent *event) {
|
|||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
if(event != NULL) {
|
if(event != NULL) {
|
||||||
triggerIdMutex.p();
|
MutexSafeWrapper safeMutex(&triggerIdMutex);
|
||||||
event->eventCompleted = true;
|
event->eventCompleted = true;
|
||||||
triggerIdMutex.v();
|
safeMutex.ReleaseLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
@ -80,9 +80,9 @@ void ConnectionSlotThread::setTaskCompleted(ConnectionSlotEvent *event) {
|
|||||||
bool ConnectionSlotThread::isSignalCompleted() {
|
bool ConnectionSlotThread::isSignalCompleted() {
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
triggerIdMutex.p();
|
MutexSafeWrapper safeMutex(&triggerIdMutex);
|
||||||
bool result = this->event->eventCompleted;
|
bool result = (this->event != NULL ? this->event->eventCompleted : true);
|
||||||
triggerIdMutex.v();
|
safeMutex.ReleaseLock();
|
||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
|
@ -645,8 +645,6 @@ bool ServerInterface::launchGame(const GameSettings* gameSettings){
|
|||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
//serverSynchAccessor.p();
|
|
||||||
|
|
||||||
for(int i= 0; i<GameConstants::maxPlayers; ++i)
|
for(int i= 0; i<GameConstants::maxPlayers; ++i)
|
||||||
{
|
{
|
||||||
ConnectionSlot *connectionSlot= slots[i];
|
ConnectionSlot *connectionSlot= slots[i];
|
||||||
@ -662,8 +660,6 @@ bool ServerInterface::launchGame(const GameSettings* gameSettings){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//serverSynchAccessor.v();
|
|
||||||
|
|
||||||
if(bOkToStart == true)
|
if(bOkToStart == true)
|
||||||
{
|
{
|
||||||
serverSocket.stopBroadCastThread();
|
serverSocket.stopBroadCastThread();
|
||||||
@ -688,7 +684,6 @@ void ServerInterface::broadcastGameSetup(const GameSettings* gameSettings) {
|
|||||||
|
|
||||||
|
|
||||||
void ServerInterface::broadcastMessage(const NetworkMessage* networkMessage, int excludeSlot){
|
void ServerInterface::broadcastMessage(const NetworkMessage* networkMessage, int excludeSlot){
|
||||||
//serverSynchAccessor.p();
|
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
//SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -724,8 +719,6 @@ void ServerInterface::broadcastMessage(const NetworkMessage* networkMessage, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ServerInterface::broadcastMessageToConnectedClients(const NetworkMessage* networkMessage, int excludeSlot){
|
void ServerInterface::broadcastMessageToConnectedClients(const NetworkMessage* networkMessage, int excludeSlot){
|
||||||
//serverSynchAccessor.p();
|
|
||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
for(int i= 0; i<GameConstants::maxPlayers; ++i) {
|
for(int i= 0; i<GameConstants::maxPlayers; ++i) {
|
||||||
@ -741,7 +734,6 @@ void ServerInterface::broadcastMessageToConnectedClients(const NetworkMessage* n
|
|||||||
}
|
}
|
||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
//serverSynchAccessor.v();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerInterface::updateListen() {
|
void ServerInterface::updateListen() {
|
||||||
@ -751,27 +743,23 @@ void ServerInterface::updateListen() {
|
|||||||
|
|
||||||
int openSlotCount= 0;
|
int openSlotCount= 0;
|
||||||
for(int i= 0; i<GameConstants::maxPlayers; ++i) {
|
for(int i= 0; i<GameConstants::maxPlayers; ++i) {
|
||||||
serverSynchAccessor.p();
|
|
||||||
bool isSlotOpen = (slots[i] != NULL && slots[i]->isConnected() == false);
|
bool isSlotOpen = (slots[i] != NULL && slots[i]->isConnected() == false);
|
||||||
serverSynchAccessor.v();
|
|
||||||
|
|
||||||
if(isSlotOpen == true) {
|
if(isSlotOpen == true) {
|
||||||
++openSlotCount;
|
++openSlotCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
serverSynchAccessor.p();
|
MutexSafeWrapper safeMutex(&serverSynchAccessor);
|
||||||
serverSocket.listen(openSlotCount);
|
serverSocket.listen(openSlotCount);
|
||||||
serverSynchAccessor.v();
|
safeMutex.ReleaseLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
int ServerInterface::getOpenSlotCount() {
|
int ServerInterface::getOpenSlotCount() {
|
||||||
int openSlotCount= 0;
|
int openSlotCount= 0;
|
||||||
|
|
||||||
for(int i= 0; i<GameConstants::maxPlayers; ++i) {
|
for(int i= 0; i<GameConstants::maxPlayers; ++i) {
|
||||||
serverSynchAccessor.p();
|
|
||||||
bool isSlotOpen = (slots[i] != NULL && slots[i]->isConnected() == false);
|
bool isSlotOpen = (slots[i] != NULL && slots[i]->isConnected() == false);
|
||||||
serverSynchAccessor.v();
|
|
||||||
|
|
||||||
if(isSlotOpen == true) {
|
if(isSlotOpen == true) {
|
||||||
++openSlotCount;
|
++openSlotCount;
|
||||||
|
@ -44,25 +44,23 @@ protected:
|
|||||||
if(accessor == cacheItemSet) {
|
if(accessor == cacheItemSet) {
|
||||||
if(value == NULL) {
|
if(value == NULL) {
|
||||||
try {
|
try {
|
||||||
mutexCache.p();
|
MutexSafeWrapper safeMutex(&mutexCache);
|
||||||
if(itemCache.find(cacheKey) != itemCache.end()) {
|
if(itemCache.find(cacheKey) != itemCache.end()) {
|
||||||
itemCache.erase(cacheKey);
|
itemCache.erase(cacheKey);
|
||||||
}
|
}
|
||||||
mutexCache.v();
|
safeMutex.ReleaseLock();
|
||||||
}
|
}
|
||||||
catch(const std::exception &ex) {
|
catch(const std::exception &ex) {
|
||||||
mutexCache.v();
|
|
||||||
throw runtime_error(ex.what());
|
throw runtime_error(ex.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
mutexCache.p();
|
MutexSafeWrapper safeMutex(&mutexCache);
|
||||||
itemCache[cacheKey] = *value;
|
itemCache[cacheKey] = *value;
|
||||||
mutexCache.v();
|
safeMutex.ReleaseLock();
|
||||||
}
|
}
|
||||||
catch(const std::exception &ex) {
|
catch(const std::exception &ex) {
|
||||||
mutexCache.v();
|
|
||||||
throw runtime_error(ex.what());
|
throw runtime_error(ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ private:
|
|||||||
// class Mutex
|
// class Mutex
|
||||||
// =====================================================
|
// =====================================================
|
||||||
|
|
||||||
class Mutex{
|
class Mutex {
|
||||||
private:
|
private:
|
||||||
SDL_mutex* mutex;
|
SDL_mutex* mutex;
|
||||||
|
|
||||||
@ -62,6 +62,28 @@ public:
|
|||||||
void v();
|
void v();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MutexSafeWrapper {
|
||||||
|
protected:
|
||||||
|
Mutex *mutex;
|
||||||
|
public:
|
||||||
|
|
||||||
|
MutexSafeWrapper(Mutex *mutex) {
|
||||||
|
this->mutex = mutex;
|
||||||
|
if(this->mutex != NULL) {
|
||||||
|
this->mutex->p();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~MutexSafeWrapper() {
|
||||||
|
ReleaseLock();
|
||||||
|
}
|
||||||
|
void ReleaseLock() {
|
||||||
|
if(this->mutex != NULL) {
|
||||||
|
this->mutex->v();
|
||||||
|
this->mutex = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// =====================================================
|
// =====================================================
|
||||||
// class Semaphore
|
// class Semaphore
|
||||||
// =====================================================
|
// =====================================================
|
||||||
|
@ -45,9 +45,9 @@ void BaseThread::signalQuit() {
|
|||||||
void BaseThread::setQuitStatus(bool value) {
|
void BaseThread::setQuitStatus(bool value) {
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
mutexQuit.p();
|
MutexSafeWrapper safeMutex(&mutexQuit);
|
||||||
quit = value;
|
quit = value;
|
||||||
mutexQuit.v();
|
safeMutex.ReleaseLock();
|
||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
}
|
}
|
||||||
@ -56,9 +56,9 @@ bool BaseThread::getQuitStatus() {
|
|||||||
//SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
//SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
bool retval = false;
|
bool retval = false;
|
||||||
mutexQuit.p();
|
MutexSafeWrapper safeMutex(&mutexQuit);
|
||||||
retval = quit;
|
retval = quit;
|
||||||
mutexQuit.v();
|
safeMutex.ReleaseLock();
|
||||||
|
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
//SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
@ -69,9 +69,9 @@ bool BaseThread::getRunningStatus() {
|
|||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
bool retval = false;
|
bool retval = false;
|
||||||
mutexRunning.p();
|
MutexSafeWrapper safeMutex(&mutexRunning);
|
||||||
retval = running;
|
retval = running;
|
||||||
mutexRunning.v();
|
safeMutex.ReleaseLock();
|
||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] running = %d\n",__FILE__,__FUNCTION__,__LINE__,retval);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] running = %d\n",__FILE__,__FUNCTION__,__LINE__,retval);
|
||||||
|
|
||||||
@ -81,9 +81,9 @@ bool BaseThread::getRunningStatus() {
|
|||||||
void BaseThread::setRunningStatus(bool value) {
|
void BaseThread::setRunningStatus(bool value) {
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] value = %d\n",__FILE__,__FUNCTION__,__LINE__,value);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] value = %d\n",__FILE__,__FUNCTION__,__LINE__,value);
|
||||||
|
|
||||||
mutexRunning.p();
|
MutexSafeWrapper safeMutex(&mutexRunning);
|
||||||
running = value;
|
running = value;
|
||||||
mutexRunning.v();
|
safeMutex.ReleaseLock();
|
||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] running = %d\n",__FILE__,__FUNCTION__,__LINE__,value);
|
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] running = %d\n",__FILE__,__FUNCTION__,__LINE__,value);
|
||||||
}
|
}
|
||||||
|
@ -135,9 +135,9 @@ void SimpleTaskThread::execute() {
|
|||||||
void SimpleTaskThread::setTaskSignalled(bool value) {
|
void SimpleTaskThread::setTaskSignalled(bool value) {
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
mutexTaskSignaller.p();
|
MutexSafeWrapper safeMutex(&mutexTaskSignaller);
|
||||||
taskSignalled = value;
|
taskSignalled = value;
|
||||||
mutexTaskSignaller.v();
|
safeMutex.ReleaseLock();
|
||||||
|
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
}
|
}
|
||||||
@ -146,9 +146,9 @@ bool SimpleTaskThread::getTaskSignalled() {
|
|||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
bool retval = false;
|
bool retval = false;
|
||||||
mutexTaskSignaller.p();
|
MutexSafeWrapper safeMutex(&mutexTaskSignaller);
|
||||||
retval = taskSignalled;
|
retval = taskSignalled;
|
||||||
mutexTaskSignaller.v();
|
safeMutex.ReleaseLock();
|
||||||
|
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user