From f13f3f81d7ad3ccda728d06f615ce5f724023f4e Mon Sep 17 00:00:00 2001 From: Iain Patterson Date: Mon, 15 Dec 2014 22:50:38 +0000 Subject: [PATCH] Single waiting function. Use a single function to wait for service status to change, regardless of if we are waiting for the service to run for a minimum period of time to be unthrottled or for it to shut down.. --- messages.mc | Bin 149762 -> 150732 bytes service.cpp | 45 +++++---------------------------------------- service.h | 3 +-- 3 files changed, 6 insertions(+), 42 deletions(-) diff --git a/messages.mc b/messages.mc index e77ea40f069c686e0c2a9e905d793c78bd58648f..577c9fc0512db128340c78416f0ca42df8141a33 100644 GIT binary patch delta 188 zcmZpg#Cc{WXG06)7A7Xo>8J7-L#C^JW)zwHMK5joqR)&an#l|q42cYR4CxH13UPjC3jC^db}XT~hjGzle1|OXG06)7A7W7046pBk^lez diff --git a/service.cpp b/service.cpp index 7e13da7..406196b 100644 --- a/service.cpp +++ b/service.cpp @@ -1688,7 +1688,7 @@ int start_service(nssm_service_t *service) { but be mindful of the fact that we are blocking the service control manager so abandon the wait before too much time has elapsed. */ - await_startup(service); + if (await_service_status_change(service, SERVICE_START_PENDING, _T("start_service"), service->throttle_delay) == 1) service->throttle = 0; /* Signal successful start */ service->status.dwCurrentState = SERVICE_RUNNING; @@ -1919,7 +1919,7 @@ void throttle_restart(nssm_service_t *service) { 0 if the wait completed. -1 on error. */ -int await_shutdown(nssm_service_t *service, TCHAR *function_name, unsigned long timeout) { +int await_service_status_change(nssm_service_t *service, unsigned long status, unsigned long desired, TCHAR *function_name, unsigned long timeout) { unsigned long interval; unsigned long waithint; unsigned long ret; @@ -1944,7 +1944,7 @@ int await_shutdown(nssm_service_t *service, TCHAR *function_name, unsigned long interval = timeout - waited; if (interval > NSSM_SERVICE_STATUS_DEADLINE) interval = NSSM_SERVICE_STATUS_DEADLINE; - service->status.dwCurrentState = SERVICE_STOP_PENDING; + service->status.dwCurrentState = control; service->status.dwWaitHint += interval; service->status.dwCheckPoint++; SetServiceStatus(service->status_handle, &service->status); @@ -1952,7 +1952,7 @@ int await_shutdown(nssm_service_t *service, TCHAR *function_name, unsigned long if (waited) { _sntprintf_s(waited_milliseconds, _countof(waited_milliseconds), _TRUNCATE, _T("%lu"), waited); _sntprintf_s(interval_milliseconds, _countof(interval_milliseconds), _TRUNCATE, _T("%lu"), interval); - log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_AWAITING_SHUTDOWN, function, service->name, waited_milliseconds, interval_milliseconds, timeout_milliseconds, 0); + log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_AWAITING_SERVICE, function, service->name, waited_milliseconds, interval_milliseconds, timeout_milliseconds, service_status_text(status), 0); } switch (WaitForSingleObject(service->process_handle, interval)) { @@ -1962,7 +1962,7 @@ int await_shutdown(nssm_service_t *service, TCHAR *function_name, unsigned long case WAIT_TIMEOUT: ret = 1; - break; + break; default: ret = -1; @@ -1977,38 +1977,3 @@ awaited: return ret; } - -int await_startup(nssm_service_t *service) { - unsigned long interval; - unsigned long waithint; - unsigned long waited; - - waithint = service->status.dwWaitHint; - waited = 0; - while (waited < service->throttle_delay) { - interval = service->throttle_delay - waited; - if (interval > NSSM_SERVICE_STATUS_DEADLINE) interval = NSSM_SERVICE_STATUS_DEADLINE; - - service->status.dwCurrentState = SERVICE_START_PENDING; - service->status.dwWaitHint += interval; - service->status.dwCheckPoint++; - SetServiceStatus(service->status_handle, &service->status); - - switch (WaitForSingleObject(service->process_handle, interval)) { - case WAIT_OBJECT_0: - return 1; - - case WAIT_TIMEOUT: - break; - - default: - return -1; - } - - waited += interval; - } - - service->throttle = 0; - - return 0; -} diff --git a/service.h b/service.h index 4ac3d6f..96498c7 100644 --- a/service.h +++ b/service.h @@ -145,7 +145,6 @@ int start_service(nssm_service_t *); int stop_service(nssm_service_t *, unsigned long, bool, bool); void CALLBACK end_service(void *, unsigned char); void throttle_restart(nssm_service_t *); -int await_shutdown(nssm_service_t *, TCHAR *, unsigned long); -int await_startup(nssm_service_t *); +int await_service_status_change(nssm_service_t *, unsigned long, unsigned long, TCHAR *, unsigned long); #endif -- 2.7.4