void CLobbyApp::UpdatePerfCounters() { static CTempTimer timerPerfCounters("assembling perf info", .05f); timerPerfCounters.Start(); m_fmClients.GetSendQueue(&(m_pCounters->cOutboundQueueLength), &(m_pCounters->cOutboundQueueSize)); m_fmClients.GetReceiveQueue(&(m_pCounters->cInboundQueueLength), &(m_pCounters->cInboundQueueSize)); m_pCounters->cPlayersLobby = m_fmClients.GetCountConnections(); m_pCounters->cServers = m_fmServers.GetConnectionCount(); // Get all the per server stuff, and agregate the count of missions and players ListConnections::Iterator iterCnxn(*m_fmServers.GetConnections()); int cMissions = 0; DWORD cPlayers = 0; while (!iterCnxn.End()) { CFLServer * pServerT = CFLServer::FromConnection(*iterCnxn.Value()); cMissions += (pServerT->GetCounters()->cMissions = pServerT->GetMissions()->GetCount()); cPlayers += (pServerT->GetCounters()->cPlayers = pServerT->GetPlayerCount()); pServerT->GetCounters()->percentLoad = pServerT->GetPercentLoad(); iterCnxn.Next(); } m_pCounters->cMissions = cMissions; m_pCounters->cPlayersMissions = cPlayers; timerPerfCounters.Stop(); }
SQLRETURN SqlGetRow(SQLHSTMT hstmt) { SQLRETURN sqlret; static CTempTimer tt("in SqlGetRow", .01f); tt.Start(); sqlret = SQLFetch(hstmt); if (SQL_SUCCESS != sqlret && SQL_NO_DATA != sqlret) SQLWhatsWrong(SQL_HANDLE_STMT, hstmt); tt.Stop(); return sqlret; }
/*------------------------------------------------------------------------- * SqlGo *------------------------------------------------------------------------- * Purpose: * Execute a prepared sql statement */ SQLRETURN SqlGo(SQLHSTMT hstmt) { SQLRETURN sqlret; static CTempTimer tt("in SqlGo", .05f); tt.Start(); if (g_hstmt_Last) SQLCloseCursor(g_hstmt_Last); // close cursor from previous execution, which may or may not exist, no harm if no cursor g_hstmt_Last = hstmt; g_fSQLRetry = false; g_cSQLRetries = 0; do { sqlret = SQLExecute(hstmt); if (SQL_SUCCESS != sqlret) SQLWhatsWrong(SQL_HANDLE_STMT, hstmt); } while (g_fSQLRetry); tt.Stop(); return sqlret; }
/*------------------------------------------------------------------------- * CLobbyApp.ProcessMsgPump *------------------------------------------------------------------------- Purpose: Process all thread messages, which so far are only sql query completion notifications Returns: Whether we received a WM_QUIT */ bool CLobbyApp::ProcessMsgPump() { static CTempTimer timerMsgPump("in message pump", 0.1f); timerMsgPump.Start(); bool fQuit = false; // Process the message queue, if any messages were received MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // dispatch Windows Messages to allow for the admin tool's COM to work TranslateMessage(&msg); switch (msg.message) { //Imago removed //#ifdef USECLUB case wm_sql_querydone: { CSQLQuery * pQuery = (CSQLQuery *) msg.lParam; pQuery->DataReady(); break; } //#endif case WM_QUIT: fQuit = true; break; default: DispatchMessage(&msg); } } timerMsgPump.Stop(); return fQuit; }
HRESULT FedSrvLobbySite::OnAppMessage(FedMessaging * pthis, CFMConnection & cnxnFrom, FEDMESSAGE * pfm) { HRESULT hr = S_OK; assert(&g.fmLobby == pthis); static CTempTimer timerOnAppMessage("in FedSrvLobbySite::OnAppMessage", .02f); timerOnAppMessage.Start(); switch (pfm->fmid) { // KGJV #114 - reactivate create mission //#if !defined(ALLSRV_STANDALONE) case FM_L_CREATE_MISSION_REQ: { #if !defined(SRV_CHILD) CASTPFM(pfmCreateMissionReq, L, CREATE_MISSION_REQ, pfm); MissionParams mp; Strcpy(mp.strGameName, ZString(FM_VAR_REF(pfmCreateMissionReq, GameName)));// + "'s game"); Strcpy(mp.szIGCStaticFile, ZString(FM_VAR_REF(pfmCreateMissionReq, IGCStaticFile))); mp.bScoresCount = false;// dont set to true till clients can change this! mp.iMaxImbalance = 0x7ffe;// added assert(!mp.Invalid()); #endif //Imago - give birth right here, feed it and off it goes... #if defined(SRV_PARENT) //start missions as thier own process STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); char szCmd[255]; char szName[32]; char szFile[32]; ZString strName = mp.strGameName; ZString strFile = mp.szIGCStaticFile; si.lpTitle = mp.strGameName; Strcpy(szName, (PCC)strName); Strcpy(szFile, (PCC)strFile); sprintf(szCmd, "AllSrv.exe \"%s\" %s %x", szName, szFile, pfmCreateMissionReq->dwCookie); // Create a NULL dacl to give "everyone" access SECURITY_DESCRIPTOR sd; SECURITY_ATTRIBUTES sa = { sizeof(sa), &sd, false }; InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, true, NULL, FALSE); if (!CreateProcess( NULL, // No module name (use command line). szCmd, NULL, NULL, FALSE, // Set handle inheritance to FALSE. CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, // we're destined to do amazing things NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi) // Pointer to PROCESS_INFORMATION structure. ) { debugf("CreateProcess failed (%d).\n", GetLastError()); } // check to make sure the child is ready before restart char strFilename[10] = "\0"; sprintf(strFilename, "%d.pid", pi.dwProcessId); HANDLE hFile = (HANDLE)CreateFile(strFilename, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL); DWORD dwError = GetLastError(); int i = 0; while (hFile == INVALID_HANDLE_VALUE || dwError == ERROR_FILE_NOT_FOUND) { if (i >= 14) //30s break; Sleep(2500); hFile = (HANDLE)CreateFile(strFilename, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL); dwError = GetLastError(); i++; } _Module.AddPID(pi.dwProcessId); CloseHandle(hFile); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); g.bRestarting = true; PostQuitMessage(0); #endif #if !defined(SRV_CHILD) #if !defined(SRV_PARENT) // pkk 2011-07-24 - Create games only with IGCs from cores.txt bool ValidCore = false; for (int i = 0; i < g.cStaticCoreInfo; i++) { if (!strcmpi(mp.szIGCStaticFile, g.vStaticCoreInfo[i].cbIGCFile)) { ValidCore = true; break; // quit loop } } if (ValidCore == true) { //Imago - start the mission in this thread as usual FedSrvSite * psiteFedSrv = new FedSrvSite(); CFSMission * pfsMissionNew = new CFSMission(mp, "", psiteFedSrv, psiteFedSrv, NULL, NULL); pfsMissionNew->SetCookie(pfmCreateMissionReq->dwCookie); } else { debugf("Lobby sent invalid core information %s, ignoring message\n", mp.szIGCStaticFile); } // pkk end #endif #endif } //Imago 6/22/08 break; //#endif -- reactivate create mission case FM_L_NEW_MISSION_ACK: { CASTPFM(pfmNewMissionAck, L, NEW_MISSION_ACK, pfm); CFSMission * pfsm = CFSMission::GetMissionFromIGCMissionID(pfmNewMissionAck->dwIGCMissionID); if (pfsm) { pfsm->SetCookie(pfmNewMissionAck->dwCookie); // If we already have players (e.g. reconnect), tell the lobby who's in the game const ShipListIGC * plistShip = pfsm->GetIGCMission()->GetShips(); for (ShipLinkIGC * plinkShip = plistShip->first(); plinkShip; plinkShip = plinkShip->next()) { IshipIGC * pShip = plinkShip->data(); CFSShip * pfsShip = GETFSSHIP(pShip); if (pfsShip->IsPlayer() && !pShip->IsGhost()) { CFSPlayer* pfsPlayer = pfsShip->GetPlayer(); BEGIN_PFM_CREATE(g.fmLobby, pfmPlayerJoined, S, PLAYER_JOINED) FM_VAR_PARM(pfsPlayer->GetName(), CB_ZTS) END_PFM_CREATE pfmPlayerJoined->dwMissionCookie = pfsm->GetCookie(); } } HRESULT hr = pthis->SendMessages(pthis->GetServerConnection(), FM_GUARANTEED, FM_FLUSH); } } break; case FM_L_TOKEN: { CASTPFM(pfmToken, L, TOKEN, pfm); Strcpy(g.m_szToken, FM_VAR_REF(pfmToken, Token)); } break; case FM_L_REMOVE_PLAYER: { CASTPFM(pfmRemovePlayer, L, REMOVE_PLAYER, pfm); CFSMission * pfsMission = CFSMission::GetMission(pfmRemovePlayer->dwMissionCookie); const char* szCharacterName = FM_VAR_REF(pfmRemovePlayer, szCharacterName); const char* szMessageParam = FM_VAR_REF(pfmRemovePlayer, szMessageParam); // try to find the player in question if (!pfsMission) { debugf("Asked to boot character %s from mission %x by lobby, " "but the mission was not found.\n", szCharacterName, pfmRemovePlayer->dwMissionCookie); } else if (!pfsMission->RemovePlayerByName(szCharacterName, (pfmRemovePlayer->reason == RPR_duplicateCDKey) ? QSR_DuplicateCDKey : QSR_DuplicateRemoteLogon, szMessageParam)) { debugf("Asked to boot character %s from mission %x by lobby, " "but the character was not found.\n", szCharacterName, pfmRemovePlayer->dwMissionCookie); } } break; case FM_L_LOGON_SERVER_NACK: { char * szReason; CASTPFM(pfmLogonNack, L, LOGON_SERVER_NACK, pfm); szReason = FM_VAR_REF(pfmLogonNack, Reason); OnMessageBox(pthis, szReason ? szReason : "Error while try to log onto server.", "Allegiance Server Error", MB_SERVICE_NOTIFICATION); // TODO: consider firing out an event message PostQuitMessage(-1); } // BT - 12/21/2010 ACSS - The lobby server will relay the rank details back to the game server. case FM_LS_PLAYER_RANK: { CQLogonStats * pquery = new CQLogonStats(GotLogonDetails); CQLogonStatsData * pqd = pquery->GetData(); CASTPFM(pfmPlayerRank, LS, PLAYER_RANK, pfm); Strcpy(pqd->szCDKey, FM_VAR_REF(pfmPlayerRank, szCDKey)); Strcpy(pqd->szCharacterName, FM_VAR_REF(pfmPlayerRank, szCharacterName)); Strcpy(pqd->szPassword, FM_VAR_REF(pfmPlayerRank, szPassword)); Strcpy(pqd->szReason, FM_VAR_REF(pfmPlayerRank, szReason)); pqd->characterID = pfmPlayerRank->characterID; pqd->fCanCheat = pfmPlayerRank->fCanCheat; pqd->fRetry = pfmPlayerRank->fRetry; pqd->dwCookie = pfmPlayerRank->dwCookie; pqd->fValid = pfmPlayerRank->fValid; pqd->dwConnectionID = pfmPlayerRank->dwConnectionID; pqd->rank = pfmPlayerRank->rank; pqd->sigma = pfmPlayerRank->sigma; pqd->mu = pfmPlayerRank->mu; pqd->commandRank = pfmPlayerRank->commandRank; pqd->commandSigma = pfmPlayerRank->commandSigma; pqd->commandMu = pfmPlayerRank->commandMu; PostThreadMessage(g.idReceiveThread, wm_sql_querydone, (WPARAM)NULL, (LPARAM)pquery); break; } break; } timerOnAppMessage.Stop("...for message type %s\n", g_rgszMsgNames[pfm->fmid]); return hr; }