X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;ds=sidebyside;f=service.cpp;h=406196b41a16c6590b7558fb5d2fa6a4412db660;hb=f13f3f81d7ad3ccda728d06f615ce5f724023f4e;hp=52937cffb399d19f82dd436b5ec117bf91c85130;hpb=b5286398f850b432edbddc6d602ab3f33ab086be;p=nssm.git diff --git a/service.cpp b/service.cpp index 52937cf..406196b 100644 --- a/service.cpp +++ b/service.cpp @@ -1394,6 +1394,7 @@ void WINAPI service_main(unsigned long argc, TCHAR **argv) { if (services) { service->handle = open_service(services, service->name, SERVICE_CHANGE_CONFIG, 0, 0); set_service_recovery(service); + CloseServiceHandle(services); } } @@ -1687,16 +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. */ - unsigned long delay = service->throttle_delay; - if (delay > NSSM_SERVICE_STATUS_DEADLINE) { - TCHAR delay_milliseconds[16]; - _sntprintf_s(delay_milliseconds, _countof(delay_milliseconds), _TRUNCATE, _T("%lu"), delay); - TCHAR deadline_milliseconds[16]; - _sntprintf_s(deadline_milliseconds, _countof(deadline_milliseconds), _TRUNCATE, _T("%lu"), NSSM_SERVICE_STATUS_DEADLINE); - log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_STARTUP_DELAY_TOO_LONG, service->name, delay_milliseconds, NSSM, deadline_milliseconds, 0); - delay = NSSM_SERVICE_STATUS_DEADLINE; - } - unsigned long deadline = WaitForSingleObject(service->process_handle, delay); + 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; @@ -1927,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; @@ -1952,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); @@ -1960,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)) { @@ -1970,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;