DWORD UmnSrvStartPollerThread( VOID ) { DWORD dwError = 0; BOOLEAN bDestroyOnError = FALSE; if (gbPollerThreadRunning) { dwError = EEXIST; BAIL_ON_UMN_ERROR(dwError); } bDestroyOnError = TRUE; dwError = pthread_cond_init( &gSignalPoller, NULL); BAIL_ON_UMN_ERROR(dwError); gbSignalPollerCreated = TRUE; dwError = pthread_mutex_init( &gSignalPollerMutex, NULL); BAIL_ON_UMN_ERROR(dwError); gbSignalPollerMutexCreated = TRUE; gbPollerThreadShouldExit = FALSE; dwError = pthread_create( &gPollerThread, NULL, UmnSrvPollerThreadRoutine, NULL); BAIL_ON_UMN_ERROR(dwError); gbPollerThreadRunning = TRUE; cleanup: return dwError; error: if (bDestroyOnError) { UmnSrvStopPollerThread(); } goto cleanup; }
NTSTATUS SvcmStop( PLW_SVCM_INSTANCE pInstance ) { UMN_LOG_VERBOSE("Shutting down threads"); UmnSrvStopPollerThread(); UmnSrvFreeConfig(gpAPIConfig); LW_ASSERT(pthread_rwlock_destroy(&gUmnConfigLock) == 0); UMN_LOG_INFO("Usermonitor Service exiting..."); return 0; }