//------------------------------------------------------------------- // // Mutex // Mutex::Mutex() { #ifdef DEBUG_MUTEXES_ if (g_MutexCounter == -1) { for (int j = 0; j < MAX_MUTEXES; j++) { g_DebugMutex[j] = -1; } } if (g_MutexCounter < MAX_MUTEXES) { counter_ = (g_MutexCounter + 1); g_MutexCounter++; } #endif hObject_ = Sys_CreateMutex(); if (hObject_ == NULL) { Sys_LogError("Mutex::Mutex: failed to create mutex"); } }
/** * Sets up module state for running a busy task. After this the busy mode event * loop is started. The loop will run until the worker thread exits. */ static void beginTask(BusyTask* task) { DENG_ASSERT(task); if(!busyInited) { busy_Mutex = Sys_CreateMutex("BUSY_MUTEX"); } if(busyInited) { App_Error("Con_Busy: Already busy.\n"); } BusyVisual_PrepareResources(); Sys_Lock(busy_Mutex); busyDone = false; busyTaskEndedWithError = false; // This is now the current task. busyTask = task; Sys_Unlock(busy_Mutex); busyInited = true; de::ProgressWidget &prog = ClientWindow::main().busy().progress(); prog.show(); prog.setText(task->name); prog.setMode(task->mode & BUSYF_ACTIVITY? de::ProgressWidget::Indefinite : de::ProgressWidget::Ranged); // Start the busy worker thread, which will process the task in the // background while we keep the user occupied with nice animations. busyThread = Sys_StartThread(busyTask->worker, busyTask->workerData); Thread_SetCallback(busyThread, busyWorkerTerminated); busyTask->_startTime = Timer_RealSeconds(); }
//----------------------------------------------------------------------------- // Purpose: Called to setup the game UI //----------------------------------------------------------------------------- void CGameUI::Start() { // determine Steam location for configuration if ( !FindPlatformDirectory( m_szPlatformDir, sizeof( m_szPlatformDir ) ) ) return; if ( IsPC() ) { // setup config file directory char szConfigDir[512]; Q_strncpy( szConfigDir, m_szPlatformDir, sizeof( szConfigDir ) ); Q_strncat( szConfigDir, "config", sizeof( szConfigDir ), COPY_ALL_CHARACTERS ); Msg( "Steam config directory: %s\n", szConfigDir ); g_pFullFileSystem->AddSearchPath(szConfigDir, "CONFIG"); g_pFullFileSystem->CreateDirHierarchy("", "CONFIG"); // user dialog configuration vgui::system()->SetUserConfigFile("InGameDialogConfig.vdf", "CONFIG"); g_pFullFileSystem->AddSearchPath( "platform", "PLATFORM" ); } // localization g_pVGuiLocalize->AddFile( "Resource/platform_%language%.txt"); g_pVGuiLocalize->AddFile( "Resource/vgui_%language%.txt"); Sys_SetLastError( SYS_NO_ERROR ); if ( IsPC() ) { g_hMutex = Sys_CreateMutex( "ValvePlatformUIMutex" ); g_hWaitMutex = Sys_CreateMutex( "ValvePlatformWaitMutex" ); if ( g_hMutex == NULL || g_hWaitMutex == NULL || Sys_GetLastError() == SYS_ERROR_INVALID_HANDLE ) { // error, can't get handle to mutex if (g_hMutex) { Sys_ReleaseMutex(g_hMutex); } if (g_hWaitMutex) { Sys_ReleaseMutex(g_hWaitMutex); } g_hMutex = NULL; g_hWaitMutex = NULL; Error("Steam Error: Could not access Steam, bad mutex\n"); return; } unsigned int waitResult = Sys_WaitForSingleObject(g_hMutex, 0); if (!(waitResult == SYS_WAIT_OBJECT_0 || waitResult == SYS_WAIT_ABANDONED)) { // mutex locked, need to deactivate Steam (so we have the Friends/ServerBrowser data files) // get the wait mutex, so that Steam.exe knows that we're trying to acquire ValveTrackerMutex waitResult = Sys_WaitForSingleObject(g_hWaitMutex, 0); if (waitResult == SYS_WAIT_OBJECT_0 || waitResult == SYS_WAIT_ABANDONED) { Sys_EnumWindows(SendShutdownMsgFunc, 1); } } // Delay playing the startup music until two frames // this allows cbuf commands that occur on the first frame that may start a map m_iPlayGameStartupSound = 2; // now we are set up to check every frame to see if we can friends/server browser m_bTryingToLoadFriends = true; m_iFriendsLoadPauseFrames = 1; } }
//----------------------------------------------------------------------------- // Purpose: Called to setup the game UI //----------------------------------------------------------------------------- void CGameUI::Start(struct cl_enginefuncs_s *engineFuncs, int interfaceVersion, IBaseSystem *system) { // TRACE_FUNCTION("CGameUI::Start"); // m_pMaster = NULL; // copy the engine interface // memcpy(&gEngfuncs, engineFuncs, sizeof(gEngfuncs)); // engine = &gEngfuncs; // set SystemWrapper for demo player // g_pSystemWrapper = system; // load mod info ModInfo().LoadCurrentGameInfo(); // Determine Tracker location. // ...If running with Steam, Tracker is in a well defined location relative to the game dir. Use it if there. // ...Otherwise get the tracker location from the registry key if (FindPlatformDirectory(m_szPlatformDir, sizeof(m_szPlatformDir))) { // add the tracker directory to the search path // add localized version first if we're not in english char language[128]; if (vgui::system()->GetRegistryString("HKEY_LOCAL_MACHINE\\Software\\Valve\\Steam\\Language", language, sizeof(language))) { if (strlen(language) > 0 && stricmp(language, "english")) { char path[256]; sprintf(path, "platform_%s", language); vgui::filesystem()->AddSearchPath(path, "PLATFORM"); } } vgui::filesystem()->AddSearchPath("platform", "PLATFORM"); // setup config file directory char szConfigDir[512]; strcpy(szConfigDir, m_szPlatformDir); strcat(szConfigDir, "config"); /* // make sure the path exists _finddata_t findData; long findHandle = _findfirst(steamPath, &findData); if (steamPath && findHandle != -1) { // put the config dir directly under steam _snprintf(szConfigDir, sizeof(szConfigDir), "%s/config", steamPath); _findclose(findHandle); } else { // we're not running steam, so just put the config dir under the platform _snprintf(szConfigDir, sizeof(szConfigDir), "%sconfig", m_szPlatformDir); } */ // add the path vgui::filesystem()->AddSearchPath(szConfigDir, "CONFIG"); // make sure the config directory has been created _mkdir(szConfigDir); vgui::ivgui()->DPrintf("Platform config directory: %s\n", szConfigDir); // user dialog configuration vgui::system()->SetUserConfigFile("InGameDialogConfig.vdf", "CONFIG"); // localization vgui::localize()->AddFile(vgui::filesystem(), "Resource/platform_%language%.txt"); vgui::localize()->AddFile(vgui::filesystem(), "Resource/vgui_%language%.txt"); //!! hack to work around problem with userinfo not being uploaded (and therefore *Tracker field) //!! this is done to make sure the *tracker userinfo field is set before we connect so that it //!! will get communicated to the server //!! this needs to be changed to a system where it is communicated to server when known but not before //!! addendum: this may very happen now with the platform changes; needs to be tested before this code //!! can be removed { // get the last known userID from the registry and set it in our userinfo string HKEY key; DWORD bufSize = sizeof(m_szPlatformDir); unsigned int lastUserID = 0; bufSize = sizeof(lastUserID); if (ERROR_SUCCESS == g_pVCR->Hook_RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Valve\\Tracker", 0, KEY_READ, &key)) { g_pVCR->Hook_RegQueryValueEx(key, "LastUserID", NULL, NULL, (unsigned char *)&lastUserID, &bufSize); // close the registry key g_pVCR->Hook_RegCloseKey(key); } if (lastUserID) { char buf[32]; sprintf(buf, "%d", lastUserID); engine->PlayerInfo_SetValueForKey("*tracker", buf); } } } // task bar - needs to be first thing created g_pTaskbar = new CTaskbar(staticPanel,"TaskBar"); g_pTaskbar->SetVisible(false); // FOR SRC // vgui::surface()->SetWorkspaceInsets( 0, 0, 0, g_pTaskbar->GetTall() ); // Start loading tracker if (m_szPlatformDir[0] != 0) { vgui::ivgui()->DPrintf2("Initializing platform...\n"); // open a mutex Sys_SetLastError(SYS_NO_ERROR); // primary mutex is the platform.exe name char szExeName[sizeof(m_szPlatformDir) + 32]; sprintf(szExeName, "%splatform.exe", m_szPlatformDir); // convert the backslashes in the path string to be forward slashes so it can be used as a mutex name for (char *ch = szExeName; *ch != 0; ch++) { *ch = tolower(*ch); if (*ch == '\\') { *ch = '/'; } } g_hMutex = Sys_CreateMutex("ValvePlatformUIMutex"); g_hWaitMutex = Sys_CreateMutex("ValvePlatformWaitMutex"); if (g_hMutex == NULL || g_hWaitMutex == NULL || Sys_GetLastError() == SYS_ERROR_INVALID_HANDLE) { // error, can't get handle to mutex if (g_hMutex) { Sys_ReleaseMutex(g_hMutex); } if (g_hWaitMutex) { Sys_ReleaseMutex(g_hWaitMutex); } g_hMutex = NULL; g_hWaitMutex = NULL; Error("Tracker Error: Could not access Tracker, bad mutex\n"); return; } unsigned int waitResult = Sys_WaitForSingleObject(g_hMutex, 0); if (!(waitResult == SYS_WAIT_OBJECT_0 || waitResult == SYS_WAIT_ABANDONED)) { // mutex locked, need to close other tracker // get the wait mutex, so that tracker.exe knows that we're trying to acquire ValveTrackerMutex waitResult = Sys_WaitForSingleObject(g_hWaitMutex, 0); if (waitResult == SYS_WAIT_OBJECT_0 || waitResult == SYS_WAIT_ABANDONED) { Sys_EnumWindows(SendShutdownMsgFunc, 1); } } m_bTryingToLoadTracker = true; // now we are set up to check every frame to see if we can Start tracker } staticPanel->SetBackgroundRenderState(CBasePanel::BACKGROUND_DESKTOPIMAGE); // start mp3 playing //engine->pfnClientCmd("mp3 loop media/gamestartup.mp3\n"); // SRC version //engine->ClientCmd("loop media/gamestartup.mp3\n"); }