Single waiting function.
[nssm.git] / service.cpp
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