Single waiting function.
authorIain Patterson <me@iain.cx>
Mon, 15 Dec 2014 22:50:38 +0000 (22:50 +0000)
committerIain Patterson <me@iain.cx>
Tue, 30 Dec 2014 15:28:36 +0000 (15:28 +0000)
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
service.cpp
service.h

index e77ea40..577c9fc 100644 (file)
Binary files a/messages.mc and b/messages.mc differ
index 7e13da7..406196b 100644 (file)
@@ -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\r
     so abandon the wait before too much time has elapsed.\r
   */\r
-  await_startup(service);\r
+  if (await_service_status_change(service, SERVICE_START_PENDING, _T("start_service"), service->throttle_delay) == 1) service->throttle = 0;\r
 \r
   /* Signal successful start */\r
   service->status.dwCurrentState = SERVICE_RUNNING;\r
@@ -1919,7 +1919,7 @@ void throttle_restart(nssm_service_t *service) {
            0 if the wait completed.\r
           -1 on error.\r
 */\r
-int await_shutdown(nssm_service_t *service, TCHAR *function_name, unsigned long timeout) {\r
+int await_service_status_change(nssm_service_t *service, unsigned long status, unsigned long desired, TCHAR *function_name, unsigned long timeout) {\r
   unsigned long interval;\r
   unsigned long waithint;\r
   unsigned long ret;\r
@@ -1944,7 +1944,7 @@ int await_shutdown(nssm_service_t *service, TCHAR *function_name, unsigned long
     interval = timeout - waited;\r
     if (interval > NSSM_SERVICE_STATUS_DEADLINE) interval = NSSM_SERVICE_STATUS_DEADLINE;\r
 \r
-    service->status.dwCurrentState = SERVICE_STOP_PENDING;\r
+    service->status.dwCurrentState = control;\r
     service->status.dwWaitHint += interval;\r
     service->status.dwCheckPoint++;\r
     SetServiceStatus(service->status_handle, &service->status);\r
@@ -1952,7 +1952,7 @@ int await_shutdown(nssm_service_t *service, TCHAR *function_name, unsigned long
     if (waited) {\r
       _sntprintf_s(waited_milliseconds, _countof(waited_milliseconds), _TRUNCATE, _T("%lu"), waited);\r
       _sntprintf_s(interval_milliseconds, _countof(interval_milliseconds), _TRUNCATE, _T("%lu"), interval);\r
-      log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_AWAITING_SHUTDOWN, function, service->name, waited_milliseconds, interval_milliseconds, timeout_milliseconds, 0);\r
+      log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_AWAITING_SERVICE, function, service->name, waited_milliseconds, interval_milliseconds, timeout_milliseconds, service_status_text(status), 0);\r
     }\r
 \r
     switch (WaitForSingleObject(service->process_handle, interval)) {\r
@@ -1962,7 +1962,7 @@ int await_shutdown(nssm_service_t *service, TCHAR *function_name, unsigned long
 \r
       case WAIT_TIMEOUT:\r
         ret = 1;\r
-      break;\r
+        break;\r
 \r
       default:\r
         ret = -1;\r
@@ -1977,38 +1977,3 @@ awaited:
 \r
   return ret;\r
 }\r
-\r
-int await_startup(nssm_service_t *service) {\r
-  unsigned long interval;\r
-  unsigned long waithint;\r
-  unsigned long waited;\r
-\r
-  waithint = service->status.dwWaitHint;\r
-  waited = 0;\r
-  while (waited < service->throttle_delay) {\r
-    interval = service->throttle_delay - waited;\r
-    if (interval > NSSM_SERVICE_STATUS_DEADLINE) interval = NSSM_SERVICE_STATUS_DEADLINE;\r
-\r
-    service->status.dwCurrentState = SERVICE_START_PENDING;\r
-    service->status.dwWaitHint += interval;\r
-    service->status.dwCheckPoint++;\r
-    SetServiceStatus(service->status_handle, &service->status);\r
-\r
-    switch (WaitForSingleObject(service->process_handle, interval)) {\r
-      case WAIT_OBJECT_0:\r
-        return 1;\r
-\r
-      case WAIT_TIMEOUT:\r
-      break;\r
-\r
-      default:\r
-        return -1;\r
-    }\r
-\r
-    waited += interval;\r
-  }\r
-\r
-  service->throttle = 0;\r
-\r
-  return 0;\r
-}\r
index 4ac3d6f..96498c7 100644 (file)
--- 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);\r
 void CALLBACK end_service(void *, unsigned char);\r
 void throttle_restart(nssm_service_t *);\r
-int await_shutdown(nssm_service_t *, TCHAR *, unsigned long);\r
-int await_startup(nssm_service_t *);\r
+int await_service_status_change(nssm_service_t *, unsigned long, unsigned long, TCHAR *, unsigned long);\r
 \r
 #endif\r