From 3405b53f659462281af9f839062b9322d2093277 Mon Sep 17 00:00:00 2001 From: Iain Patterson Date: Mon, 28 Feb 2011 11:48:11 +0000 Subject: [PATCH] Fix pre-Vista compatibility. SleepConditionVariableCS() isn't available on Windows versions prior to Vista. Use a waitable timer instead. --- service.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/service.cpp b/service.cpp index 283cbea..4f7ff03 100644 --- a/service.cpp +++ b/service.cpp @@ -11,8 +11,8 @@ char flags[CMD_LENGTH]; char dir[MAX_PATH]; bool stopping; unsigned long throttle_delay; -CRITICAL_SECTION throttle_section; -CONDITION_VARIABLE throttle_condition; +HANDLE throttle_timer; +LARGE_INTEGER throttle_duetime; static enum { NSSM_EXIT_RESTART, NSSM_EXIT_IGNORE, NSSM_EXIT_REALLY, NSSM_EXIT_UNCLEAN } exit_actions; static const char *exit_action_strings[] = { "Restart", "Ignore", "Exit", "Suicide", 0 }; @@ -209,7 +209,7 @@ void WINAPI service_main(unsigned long argc, char **argv) { set_service_recovery(service_name); /* Used for signalling a resume if the service pauses when throttled. */ - InitializeCriticalSection(&throttle_section); + throttle_timer = CreateWaitableTimer(0, 1, 0); monitor_service(); } @@ -260,7 +260,8 @@ unsigned long WINAPI service_control_handler(unsigned long control, unsigned lon case SERVICE_CONTROL_CONTINUE: throttle = 0; - WakeConditionVariable(&throttle_condition); + ZeroMemory(&throttle_duetime, sizeof(throttle_duetime)); + SetWaitableTimer(throttle_timer, &throttle_duetime, 0, 0, 0, 0); service_status.dwCurrentState = SERVICE_CONTINUE_PENDING; service_status.dwWaitHint = throttle_milliseconds() + NSSM_WAITHINT_MARGIN; log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_RESET_THROTTLE, service_name, 0); @@ -454,12 +455,12 @@ void throttle_restart() { _snprintf(milliseconds, sizeof(milliseconds), "%d", ms); log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_THROTTLED, service_name, threshold, milliseconds, 0); - EnterCriticalSection(&throttle_section); + ZeroMemory(&throttle_duetime, sizeof(throttle_duetime)); + throttle_duetime.QuadPart = 0 - (ms * 10000); + SetWaitableTimer(throttle_timer, &throttle_duetime, 0, 0, 0, 0); service_status.dwCurrentState = SERVICE_PAUSED; SetServiceStatus(service_handle, &service_status); - SleepConditionVariableCS(&throttle_condition, &throttle_section, ms); - - LeaveCriticalSection(&throttle_section); + WaitForSingleObject(throttle_timer, INFINITE); } -- 2.7.4