diff --git a/source/glest_game/game/chat_manager.cpp b/source/glest_game/game/chat_manager.cpp index a288e194..1ea219bf 100644 --- a/source/glest_game/game/chat_manager.cpp +++ b/source/glest_game/game/chat_manager.cpp @@ -471,10 +471,13 @@ void ChatManager::updateNetwork() { //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] gameNetworkInterface->getChatText() [%s]\n",__FILE__,__FUNCTION__,__LINE__,gameNetworkInterface->getChatText().c_str()); - if(gameNetworkInterface != NULL && gameNetworkInterface->getChatTextList().empty() == false) { + if(gameNetworkInterface != NULL && + gameNetworkInterface->getChatTextList(false).empty() == false) { Lang &lang= Lang::getInstance(); - for(int idx = 0; idx < gameNetworkInterface->getChatTextList().size(); idx++) { - const ChatMsgInfo &msg = gameNetworkInterface->getChatTextList()[idx]; + + std::vector chatList = gameNetworkInterface->getChatTextList(true); + for(int idx = 0; idx < chatList.size(); idx++) { + const ChatMsgInfo msg = chatList[idx]; int teamIndex= msg.chatTeamIndex; SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] got nmtText [%s] for team = %d\n",__FILE__,__FUNCTION__,msg.chatText.c_str(),teamIndex); @@ -491,7 +494,7 @@ void ChatManager::updateNetwork() { 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__); - gameNetworkInterface->clearChatInfo(); + //gameNetworkInterface->clearChatInfo(); } } catch(const std::exception &ex) { diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index 5b2ee448..9253b70a 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -3232,10 +3232,10 @@ void Game::showLoseMessageBox() { NetworkManager &networkManager= NetworkManager::getInstance(); if(networkManager.isNetworkGame() == true && networkManager.getNetworkRole() == nrServer) { - showMessageBox(lang.get("YouLose")+", "+lang.get("ExitGameServer?"), lang.get("BattleOver"), false); + showMessageBox(lang.get("YouLose")+" "+lang.get("ExitGameServer?"), lang.get("BattleOver"), false); } else { - showMessageBox(lang.get("YouLose")+", "+lang.get("ExitGame?"), lang.get("BattleOver"), false); + showMessageBox(lang.get("YouLose")+" "+lang.get("ExitGame?"), lang.get("BattleOver"), false); } } @@ -3243,10 +3243,10 @@ void Game::showWinMessageBox() { Lang &lang= Lang::getInstance(); if(this->masterserverMode == true || world.getThisFaction()->getType()->getPersonalityType() == fpt_Observer) { - showMessageBox(lang.get("GameOver")+", "+lang.get("ExitGame?"), lang.get("BattleOver"), false); + showMessageBox(lang.get("GameOver")+" "+lang.get("ExitGame?"), lang.get("BattleOver"), false); } else { - showMessageBox(lang.get("YouWin")+", "+lang.get("ExitGame?"), lang.get("BattleOver"), false); + showMessageBox(lang.get("YouWin")+" "+lang.get("ExitGame?"), lang.get("BattleOver"), false); } } diff --git a/source/glest_game/network/connection_slot.cpp b/source/glest_game/network/connection_slot.cpp index 8eef0b23..751c965e 100644 --- a/source/glest_game/network/connection_slot.cpp +++ b/source/glest_game/network/connection_slot.cpp @@ -32,16 +32,18 @@ namespace Glest{ namespace Game{ // class ConnectionSlotThread // ===================================================== -ConnectionSlotThread::ConnectionSlotThread(int slotIndex) : BaseThread() { - this->slotIndex = slotIndex; +ConnectionSlotThread::ConnectionSlotThread(ConnectionSlot *slot) : BaseThread() { + this->slot = slot; + this->slotIndex = this->slot->getPlayerIndex(); this->slotInterface = NULL; //this->event = NULL; eventList.clear(); eventList.reserve(100); } -ConnectionSlotThread::ConnectionSlotThread(ConnectionSlotCallbackInterface *slotInterface,int slotIndex) : BaseThread() { - this->slotIndex = slotIndex; +ConnectionSlotThread::ConnectionSlotThread(ConnectionSlotCallbackInterface *slotInterface,ConnectionSlot *slot) : BaseThread() { + this->slot = slot; + this->slotIndex = this->slot->getPlayerIndex(); this->slotInterface = slotInterface; //this->event = NULL; eventList.clear(); @@ -163,6 +165,9 @@ void ConnectionSlotThread::execute() { //setRunningStatus(true); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + Chrono chrono; + chrono.start(); + //unsigned int idx = 0; for(;this->slotInterface != NULL;) { if(getQuitStatus() == true) { @@ -170,13 +175,14 @@ void ConnectionSlotThread::execute() { break; } - semTaskSignalled.waitTillSignalled(); + //semTaskSignalled.waitTillSignalled(); - if(getQuitStatus() == true) { - if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - break; - } + //if(getQuitStatus() == true) { + // if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + // break; + //} +/* MutexSafeWrapper safeMutex(&triggerIdMutex,CODE_AT_LINE); int eventCount = eventList.size(); if(eventCount > 0) { @@ -208,11 +214,24 @@ void ConnectionSlotThread::execute() { else { safeMutex.ReleaseLock(); } +*/ + if(this->slot != NULL) { + ConnectionSlotEvent event; + event.triggerId = this->slotIndex; + event.socketTriggered = true; + + ExecutingTaskSafeWrapper safeExecutingTaskMutex(this); + this->slot->updateSlot(&event); + } if(getQuitStatus() == true) { if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); break; } + + if(chrono.getMillis() % 300 == 0) { + sleep(1); + } } if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -250,7 +269,8 @@ ConnectionSlot::ConnectionSlot(ServerInterface* serverInterface, int playerIndex this->setSocket(NULL); this->slotThreadWorker = NULL; - this->slotThreadWorker = new ConnectionSlotThread(this->serverInterface,playerIndex); + //this->slotThreadWorker = new ConnectionSlotThread(this->serverInterface,playerIndex); + this->slotThreadWorker = new ConnectionSlotThread(this->serverInterface,this); this->slotThreadWorker->setUniqueID(__FILE__); this->slotThreadWorker->start(); @@ -290,19 +310,19 @@ void ConnectionSlot::updateSlot(ConnectionSlotEvent *event) { Chrono chrono; if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled) chrono.start(); - if(event != NULL) { - bool &socketTriggered = event->socketTriggered; + //if(event != NULL) { + //bool &socketTriggered = event->socketTriggered; bool checkForNewClients = (serverInterface->getGameHasBeenInitiated() == false); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); //if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] MUTEX LOCK held for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis()); - if((serverInterface->getGameHasBeenInitiated() == false || + //if((serverInterface->getGameHasBeenInitiated() == false || //(this->getSocket() != NULL && socketTriggered == true))) { - socketTriggered == true)) { - if(socketTriggered == true || - (serverInterface->getGameHasBeenInitiated() == false && this->isConnected() == false)) { + // socketTriggered == true)) { + // if(socketTriggered == true || + // (serverInterface->getGameHasBeenInitiated() == false && this->isConnected() == false)) { //if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] MUTEX LOCK held for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis()); @@ -316,10 +336,10 @@ void ConnectionSlot::updateSlot(ConnectionSlotEvent *event) { //if(this->getSocket() == NULL) { // checkForNewClients = false; //} - } + //} //if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] MUTEX LOCK held for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis()); - } - } + //} + //} if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); } @@ -330,9 +350,9 @@ void ConnectionSlot::update(bool checkForNewClients,int lockedSlotIndex) { try { clearThreadErrorList(); - if(slotThreadWorker != NULL) { - slotThreadWorker->purgeCompletedEvents(); - } + //if(slotThreadWorker != NULL) { + // slotThreadWorker->purgeCompletedEvents(); + //} //if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis()); @@ -464,7 +484,7 @@ void ConnectionSlot::update(bool checkForNewClients,int lockedSlotIndex) { //if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis()); - this->clearChatInfo(); + //this->clearChatInfo(); bool gotTextMsg = true; for(;this->hasDataToRead() == true && gotTextMsg == true;) { diff --git a/source/glest_game/network/connection_slot.h b/source/glest_game/network/connection_slot.h index dfebcf82..4b6e3ce2 100644 --- a/source/glest_game/network/connection_slot.h +++ b/source/glest_game/network/connection_slot.h @@ -78,6 +78,7 @@ protected: Mutex triggerIdMutex; vector eventList; int slotIndex; + ConnectionSlot *slot; virtual void setQuitStatus(bool value); virtual void setTaskCompleted(int eventId); @@ -86,8 +87,8 @@ protected: void slotUpdateTask(ConnectionSlotEvent *event); public: - ConnectionSlotThread(int slotIndex); - ConnectionSlotThread(ConnectionSlotCallbackInterface *slotInterface,int slotIndex); + ConnectionSlotThread(ConnectionSlot *slot); + ConnectionSlotThread(ConnectionSlotCallbackInterface *slotInterface,ConnectionSlot *slot); virtual void execute(); void signalUpdate(ConnectionSlotEvent *event); bool isSignalCompleted(ConnectionSlotEvent *event); diff --git a/source/glest_game/network/network_interface.cpp b/source/glest_game/network/network_interface.cpp index 4ac715bf..44bbadb4 100644 --- a/source/glest_game/network/network_interface.cpp +++ b/source/glest_game/network/network_interface.cpp @@ -108,7 +108,24 @@ void NetworkInterface::DisplayErrorMessage(string sErr, bool closeSocket) { } } +std::vector NetworkInterface::getChatTextList(bool clearAfterRetrieve) { + std::vector result; + MutexSafeWrapper safeMutex(&mutexChatTextList,CODE_AT_LINE); + result = chatTextList; + if(clearAfterRetrieve == true) { + chatTextList.clear(); + } + + return result; +} + +void NetworkInterface::addChatInfo(const ChatMsgInfo &msg) { + MutexSafeWrapper safeMutex(&mutexChatTextList,CODE_AT_LINE); + chatTextList.push_back(msg); +} + void NetworkInterface::clearChatInfo() { + MutexSafeWrapper safeMutex(&mutexChatTextList,CODE_AT_LINE); if(chatTextList.empty() == false) { if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] chatTextList.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,chatTextList.size()); chatTextList.clear(); diff --git a/source/glest_game/network/network_interface.h b/source/glest_game/network/network_interface.h index f816dddf..6096d81e 100644 --- a/source/glest_game/network/network_interface.h +++ b/source/glest_game/network/network_interface.h @@ -93,6 +93,7 @@ protected: string networkGameDataSynchCheckTechMismatchReport; bool receivedDataSynchCheck; + Mutex mutexChatTextList; std::vector chatTextList; NetworkMessagePing lastPingInfo; @@ -141,9 +142,9 @@ public: virtual bool getNetworkGameDataSynchCheckOkTile() { return networkGameDataSynchCheckOkTile; } virtual bool getNetworkGameDataSynchCheckOkTech() { return networkGameDataSynchCheckOkTech; } - const std::vector & getChatTextList() const { return chatTextList; } + std::vector getChatTextList(bool clearAfterRetrieve); void clearChatInfo(); - void addChatInfo(const ChatMsgInfo &msg) { chatTextList.push_back(msg); } + void addChatInfo(const ChatMsgInfo &msg); virtual bool getConnectHasHandshaked() const= 0; diff --git a/source/glest_game/network/server_interface.cpp b/source/glest_game/network/server_interface.cpp index b8ec74f5..b687b278 100644 --- a/source/glest_game/network/server_interface.cpp +++ b/source/glest_game/network/server_interface.cpp @@ -882,6 +882,110 @@ void ServerInterface::checkForLaggingClients(std::map &mapSlotSignalle } } +void ServerInterface::checkForLaggingClients(std::vector &errorMsgList) { + bool lastGlobalLagCheckTimeUpdate = false; + time_t waitForClientsElapsed = time(NULL); + time_t waitForThreadElapsed = time(NULL); + std::map slotsWarnedList; + // Examine all threads for completion of delegation + for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) { + MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i)); + ConnectionSlot* connectionSlot = slots[i]; + if(connectionSlot != NULL) { + try { + std::vector errorList = connectionSlot->getThreadErrorList(); + // Show any collected errors from threads + if(errorList.empty() == false) { + for(int iErrIdx = 0; iErrIdx < errorList.size(); ++iErrIdx) { + string &sErr = errorList[iErrIdx]; + if(sErr != "") { + errorMsgList.push_back(sErr); + } + } + connectionSlot->clearThreadErrorList(); + } + + // New lag check + std::pair clientLagExceededOrWarned = std::make_pair(false,false); + if( gameHasBeenInitiated == true && + connectionSlot->isConnected() == true) { + clientLagExceededOrWarned = clientLagCheck(connectionSlot,slotsWarnedList[i]); + + if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] clientLagExceededOrWarned.first = %d, clientLagExceededOrWarned.second = %d, gameSettings.getNetworkPauseGameForLaggedClients() = %d\n",__FILE__,__FUNCTION__,__LINE__,clientLagExceededOrWarned.first,clientLagExceededOrWarned.second,gameSettings.getNetworkPauseGameForLaggedClients()); + + if(clientLagExceededOrWarned.first == true) { + slotsWarnedList[i] = true; + } + } + // If the client has exceeded lag and the server wants + // to pause while they catch up, re-trigger the + // client reader thread +// if((clientLagExceededOrWarned.first == true && gameSettings.getNetworkPauseGameForLaggedClients() == true)) { // || +// //(clientLagExceededOrWarned.second == true && slotsWarnedAndRetried[i] == false)) { +// +// if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d, clientLagExceededOrWarned.first = %d, clientLagExceededOrWarned.second = %d, difftime(time(NULL),waitForClientsElapsed) = %.2f, MAX_CLIENT_WAIT_SECONDS_FOR_PAUSE = %.2f\n",__FILE__,__FUNCTION__,__LINE__,clientLagExceededOrWarned.first,clientLagExceededOrWarned.second,difftime(time(NULL),waitForClientsElapsed),MAX_CLIENT_WAIT_SECONDS_FOR_PAUSE); +// +// if(difftime(time(NULL),waitForClientsElapsed) < MAX_CLIENT_WAIT_SECONDS_FOR_PAUSE) { +// if(connectionSlot != NULL) { +// if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d, clientLagExceededOrWarned.first = %d, clientLagExceededOrWarned.second = %d\n",__FILE__,__FUNCTION__,__LINE__,clientLagExceededOrWarned.first,clientLagExceededOrWarned.second); +// +// bool socketTriggered = false; +// PLATFORM_SOCKET clientSocket = connectionSlot->getSocketId(); +// if(clientSocket > 0) { +// socketTriggered = socketTriggeredList[clientSocket]; +// } +// ConnectionSlotEvent &event = eventList[i]; +// mapSlotSignalledList[i] = signalClientReceiveCommands(connectionSlot,i,socketTriggered,event); +// threadsDone = false; +// } +// if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d, clientLagExceededOrWarned.first = %d, clientLagExceededOrWarned.second = %d\n",__FILE__,__FUNCTION__,__LINE__,clientLagExceededOrWarned.first,clientLagExceededOrWarned.second); +// } +// } + } + catch(const exception &ex) { + SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] error detected [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + errorMsgList.push_back(ex.what()); + } + } + + if(connectionSlot != NULL && connectionSlot->isConnected() == true) { + try { + if(gameHasBeenInitiated == true && + difftime(time(NULL),lastGlobalLagCheckTime) >= LAG_CHECK_GRACE_PERIOD) { + + //printf("\n\n\n^^^^^^^^^^^^^^ PART A\n\n\n"); + + // New lag check + std::pair clientLagExceededOrWarned = std::make_pair(false,false); + if( gameHasBeenInitiated == true && connectionSlot != NULL && + connectionSlot->isConnected() == true) { + //printf("\n\n\n^^^^^^^^^^^^^^ PART B\n\n\n"); + + lastGlobalLagCheckTimeUpdate = true; + clientLagExceededOrWarned = clientLagCheck(connectionSlot,slotsWarnedList[i]); + + if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] clientLagExceededOrWarned.first = %d, clientLagExceededOrWarned.second = %d, gameSettings.getNetworkPauseGameForLaggedClients() = %d\n",__FILE__,__FUNCTION__,__LINE__,clientLagExceededOrWarned.first,clientLagExceededOrWarned.second,gameSettings.getNetworkPauseGameForLaggedClients()); + + if(clientLagExceededOrWarned.first == true) { + slotsWarnedList[i] = true; + } + } + } + } + catch(const exception &ex) { + SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] error detected [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + errorMsgList.push_back(ex.what()); + } + } + } + + if(lastGlobalLagCheckTimeUpdate == true) { + lastGlobalLagCheckTime = time(NULL); + } +} + void ServerInterface::executeNetworkCommandsFromClients() { if(gameHasBeenInitiated == true) { for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) { @@ -905,14 +1009,15 @@ void ServerInterface::dispatchPendingChatMessages(std::vector &errorMsg MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i)); ConnectionSlot* connectionSlot= slots[i]; if(connectionSlot != NULL && - connectionSlot->getChatTextList().empty() == false) { + connectionSlot->getChatTextList(false).empty() == false) { try { + std::vector chatList = connectionSlot->getChatTextList(true); for(int chatIdx = 0; - exitServer == false && slots[i] != NULL && - chatIdx < connectionSlot->getChatTextList().size(); chatIdx++) { - connectionSlot= slots[i]; - if(connectionSlot != NULL) { - ChatMsgInfo msg(connectionSlot->getChatTextList()[chatIdx]); + exitServer == false && + chatIdx < chatList.size(); chatIdx++) { + //connectionSlot= slots[i]; + //if(connectionSlot != NULL) { + ChatMsgInfo msg(chatList[chatIdx]); this->addChatInfo(msg); string newChatText = msg.chatText.c_str(); @@ -928,15 +1033,15 @@ void ServerInterface::dispatchPendingChatMessages(std::vector &errorMsg } if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] after broadcast nmtText chatText [%s] chatTeamIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,newChatText.c_str(),newChatTeamIndex); - } + //} } if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] i = %d\n",__FILE__,__FUNCTION__,__LINE__,i); // Its possible that the slot is disconnected here // so check the original pointer again - if(slots[i] != NULL) { - slots[i]->clearChatInfo(); - } + //if(slots[i] != NULL) { + // slots[i]->clearChatInfo(); + //} } catch(const exception &ex) { SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); @@ -970,41 +1075,44 @@ void ServerInterface::update() { if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); - std::map socketTriggeredList; + //std::map socketTriggeredList; //update all slots - updateSocketTriggeredList(socketTriggeredList); + //updateSocketTriggeredList(socketTriggeredList); //printf("\nServerInterface::update -- D\n"); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); - if(gameHasBeenInitiated == false || socketTriggeredList.empty() == false) { + //if(gameHasBeenInitiated == false || socketTriggeredList.empty() == false) { + { //printf("\nServerInterface::update -- E\n"); - std::map eventList; - bool hasData = Socket::hasDataToRead(socketTriggeredList); + //std::map eventList; + //bool hasData = Socket::hasDataToRead(socketTriggeredList); - if(hasData) if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] hasData == true\n",__FILE__,__FUNCTION__); + //if(hasData) if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] hasData == true\n",__FILE__,__FUNCTION__); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); - if(gameHasBeenInitiated == false || hasData == true) { - std::map mapSlotSignalledList; + //if(gameHasBeenInitiated == false || hasData == true) { + { + //std::map mapSlotSignalledList; // Step #1 tell all connection slot worker threads to receive socket data - signalClientsToRecieveData(socketTriggeredList, eventList, mapSlotSignalledList); + //signalClientsToRecieveData(socketTriggeredList, eventList, mapSlotSignalledList); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] ============ Step #2\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); // Step #2 check all connection slot worker threads for completed status - checkForCompletedClients(mapSlotSignalledList,errorMsgList, eventList); + //checkForCompletedClients(mapSlotSignalledList,errorMsgList, eventList); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] ============ Step #3\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); // Step #3 check clients for any lagging scenarios and try to deal with them - checkForLaggingClients(mapSlotSignalledList, eventList, socketTriggeredList,errorMsgList); + //checkForLaggingClients(mapSlotSignalledList, eventList, socketTriggeredList,errorMsgList); + checkForLaggingClients(errorMsgList); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] ============ Step #4\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); @@ -1021,27 +1129,27 @@ void ServerInterface::update() { if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); } - else if(gameHasBeenInitiated == true && - difftime(time(NULL),lastGlobalLagCheckTime) >= LAG_CHECK_GRACE_PERIOD) { - //printf("\nServerInterface::update -- E1\n"); - - //std::map eventList; - std::map mapSlotSignalledList; - - checkForLaggingClients(mapSlotSignalledList, eventList, socketTriggeredList,errorMsgList); - } +// else if(gameHasBeenInitiated == true && +// difftime(time(NULL),lastGlobalLagCheckTime) >= LAG_CHECK_GRACE_PERIOD) { +// //printf("\nServerInterface::update -- E1\n"); +// +// //std::map eventList; +// std::map mapSlotSignalledList; +// +// checkForLaggingClients(mapSlotSignalledList, eventList, socketTriggeredList,errorMsgList); +// } if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took %lld msecs\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); } - else if(gameHasBeenInitiated == true && - difftime(time(NULL),lastGlobalLagCheckTime) >= LAG_CHECK_GRACE_PERIOD) { - //printf("\nServerInterface::update -- F\n"); - - std::map eventList; - std::map mapSlotSignalledList; - - checkForLaggingClients(mapSlotSignalledList, eventList, socketTriggeredList,errorMsgList); - } +// else if(gameHasBeenInitiated == true && +// difftime(time(NULL),lastGlobalLagCheckTime) >= LAG_CHECK_GRACE_PERIOD) { +// //printf("\nServerInterface::update -- F\n"); +// +// std::map eventList; +// std::map mapSlotSignalledList; +// +// checkForLaggingClients(mapSlotSignalledList, eventList, socketTriggeredList,errorMsgList); +// } //printf("\nServerInterface::update -- G\n"); } diff --git a/source/glest_game/network/server_interface.h b/source/glest_game/network/server_interface.h index b79a2924..2dc33692 100644 --- a/source/glest_game/network/server_interface.h +++ b/source/glest_game/network/server_interface.h @@ -207,6 +207,7 @@ protected: void signalClientsToRecieveData(std::map & socketTriggeredList, std::map & eventList, std::map & mapSlotSignalledList); void checkForCompletedClients(std::map & mapSlotSignalledList,std::vector &errorMsgList,std::map &eventList); void checkForLaggingClients(std::map &mapSlotSignalledList, std::map &eventList, std::map &socketTriggeredList,std::vector &errorMsgList); + void checkForLaggingClients(std::vector &errorMsgList); void executeNetworkCommandsFromClients(); void dispatchPendingChatMessages(std::vector &errorMsgList); };