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
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
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
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
\r
case WAIT_TIMEOUT:\r
ret = 1;\r
- break;\r
+ break;\r
\r
default:\r
ret = -1;\r
\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
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