From 6628c2a573a6e94ead76d5454d0438dc396a70c6 Mon Sep 17 00:00:00 2001 From: Iain Patterson Date: Wed, 31 Dec 2014 14:33:57 +0000 Subject: [PATCH] Don't time out waiting for service status change. Wait for service to start (or fail to start) or stop instead of timing out after five seconds. An NSSM service which doesn't start properly and temporarily enters paused state may end up reporting running state in response to a stop control. Therefore we now consider SERVICE_RUNNING to be a valid response to SERVICE_CONTROL_STOP. --- service.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/service.cpp b/service.cpp index c6ac099..5a28641 100644 --- a/service.cpp +++ b/service.cpp @@ -38,6 +38,7 @@ static inline int service_control_response(unsigned long control, unsigned long case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: switch (status) { + case SERVICE_RUNNING: case SERVICE_STOP_PENDING: return 1; @@ -73,6 +74,7 @@ static inline int service_control_response(unsigned long control, unsigned long } case SERVICE_CONTROL_INTERROGATE: + case NSSM_SERVICE_CONTROL_ROTATE: return 0; } @@ -81,12 +83,17 @@ static inline int service_control_response(unsigned long control, unsigned long static inline int await_service_control_response(unsigned long control, SC_HANDLE service_handle, SERVICE_STATUS *service_status, unsigned long initial_status) { int tries = 0; + unsigned long checkpoint = 0; + unsigned long waithint = 0; while (QueryServiceStatus(service_handle, service_status)) { int response = service_control_response(control, service_status->dwCurrentState); /* Alas we can't WaitForSingleObject() on an SC_HANDLE. */ if (! response) return response; if (response > 0 || service_status->dwCurrentState == initial_status) { - if (++tries > 10) return response; + if (service_status->dwCheckPoint != checkpoint || service_status->dwWaitHint != waithint) tries = 0; + checkpoint = service_status->dwCheckPoint; + waithint = service_status->dwWaitHint; + if (++tries > 10) tries = 10; Sleep(50 * tries); } else return response; -- 2.7.4