45 std::vector<char> vecstring(std::string
const &
str)
53 template <
typename T_handler>
54 class t_service_runner final
57 SERVICE_STATUS_HANDLE m_status_handle{
nullptr};
58 SERVICE_STATUS m_status{};
59 boost::mutex m_lock{};
63 static std::unique_ptr<t_service_runner<T_handler>> sp_instance;
70 , m_handler{std::
move(handler)}
72 m_status.dwServiceType = SERVICE_WIN32;
73 m_status.dwCurrentState = SERVICE_STOPPED;
74 m_status.dwControlsAccepted = 0;
75 m_status.dwWin32ExitCode = NO_ERROR;
76 m_status.dwServiceSpecificExitCode = NO_ERROR;
77 m_status.dwCheckPoint = 0;
78 m_status.dwWaitHint = 0;
81 t_service_runner & operator=(t_service_runner && other)
85 m_status_handle = std::move(other.m_status_handle);
86 m_status = std::move(other.m_status);
87 m_name = std::move(other.m_name);
88 m_handler = std::move(other.m_handler);
98 sp_instance.reset(
new t_service_runner<T_handler>{
109 SERVICE_TABLE_ENTRY table[] =
111 { vecstring(m_name).data(), &service_main }
115 StartServiceCtrlDispatcher(table);
118 void report_status(DWORD status)
120 m_status.dwCurrentState = status;
121 if (status == SERVICE_RUNNING)
123 m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
125 else if(status == SERVICE_STOP_PENDING)
127 m_status.dwControlsAccepted = 0;
129 SetServiceStatus(m_status_handle, &m_status);
132 static void WINAPI service_main(DWORD argc, LPSTR * argv)
134 sp_instance->service_main_(argc, argv);
137 void service_main_(DWORD argc, LPSTR * argv)
139 m_status_handle = RegisterServiceCtrlHandler(m_name.c_str(), &on_state_change_request);
140 if (m_status_handle ==
nullptr)
return;
142 report_status(SERVICE_START_PENDING);
144 report_status(SERVICE_RUNNING);
148 on_state_change_request_(SERVICE_CONTROL_STOP);
154 static void WINAPI on_state_change_request(DWORD control_code)
156 sp_instance->on_state_change_request_(control_code);
159 void on_state_change_request_(DWORD control_code)
161 switch (control_code)
163 case SERVICE_CONTROL_INTERROGATE:
165 case SERVICE_CONTROL_SHUTDOWN:
166 case SERVICE_CONTROL_STOP:
167 report_status(SERVICE_STOP_PENDING);
169 report_status(SERVICE_STOPPED);
171 case SERVICE_CONTROL_PAUSE:
173 case SERVICE_CONTROL_CONTINUE:
181 template <
typename T_handler>
182 std::unique_ptr<t_service_runner<T_handler>> t_service_runner<T_handler>::sp_instance;
run(t, blocks)
Definition block_weight.py:35
const T & move(const T &t)
Definition gtest-port.h:1317
Definition windows_service.cpp:46
bool uninstall_service(std::string const &service_name)
Definition windows_service.cpp:327
const char * name
Definition options.c:30
const char *const str
Definition portlistingparse.c:23
tools::wallet2::message_signature_result_t result
Definition signature.cpp:62