X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=service.cpp;h=4011484e95467a0d9ba65e7d12f1ca63b8143f29;hb=ab747b344a34bdd9128c8b84cf9fde016f6bc308;hp=4f7ff033dcf80534612788772baca84693cfd0e6;hpb=3405b53f659462281af9f839062b9322d2093277;p=nssm.git diff --git a/service.cpp b/service.cpp index 4f7ff03..4011484 100644 --- a/service.cpp +++ b/service.cpp @@ -210,6 +210,9 @@ void WINAPI service_main(unsigned long argc, char **argv) { /* Used for signalling a resume if the service pauses when throttled. */ throttle_timer = CreateWaitableTimer(0, 1, 0); + if (! throttle_timer) { + log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_CREATEWAITABLETIMER_FAILED, service_name, error_string(GetLastError()), 0); + } monitor_service(); } @@ -259,6 +262,7 @@ unsigned long WINAPI service_control_handler(unsigned long control, unsigned lon return NO_ERROR; case SERVICE_CONTROL_CONTINUE: + if (! throttle_timer) return ERROR_CALL_NOT_IMPLEMENTED; throttle = 0; ZeroMemory(&throttle_duetime, sizeof(throttle_duetime)); SetWaitableTimer(throttle_timer, &throttle_duetime, 0, 0, 0, 0); @@ -304,7 +308,7 @@ int start_service() { /* Launch executable with arguments */ char cmd[CMD_LENGTH]; - if (_snprintf(cmd, sizeof(cmd), "%s %s", exe, flags) < 0) { + if (_snprintf(cmd, sizeof(cmd), "\"%s\" %s", exe, flags) < 0) { log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, "command line", "start_service", 0); return stop_service(2, true, true); } @@ -455,12 +459,15 @@ void throttle_restart() { _snprintf(milliseconds, sizeof(milliseconds), "%d", ms); log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_THROTTLED, service_name, threshold, milliseconds, 0); - ZeroMemory(&throttle_duetime, sizeof(throttle_duetime)); - throttle_duetime.QuadPart = 0 - (ms * 10000); - SetWaitableTimer(throttle_timer, &throttle_duetime, 0, 0, 0, 0); + if (throttle_timer) { + ZeroMemory(&throttle_duetime, sizeof(throttle_duetime)); + throttle_duetime.QuadPart = 0 - (ms * 10000LL); + SetWaitableTimer(throttle_timer, &throttle_duetime, 0, 0, 0, 0); + } service_status.dwCurrentState = SERVICE_PAUSED; SetServiceStatus(service_handle, &service_status); - WaitForSingleObject(throttle_timer, INFINITE); + if (throttle_timer) WaitForSingleObject(throttle_timer, INFINITE); + else Sleep(ms); }