(service_main,main,shutdown) [_WIN32]: Add missing loc_NTTerm().
(service_main,main,shutdown,empth_exit,service_stopped) [_WIN32]: Add shutdown Event to allow the service to shutdown. When SERVICE_STOPPED is passed to SetServiceStatus() all threads are kills this prevents shutdown() from executing. The shutdown Event is used to block the service_main thread until the stopping of the service is started. After the shutdown() is complete then the SetServiceStatus() is called.
This commit is contained in:
parent
6c7f707b76
commit
014d005c69
3 changed files with 42 additions and 36 deletions
|
@ -473,9 +473,7 @@ empth_exit(void)
|
|||
/* The main line. Wait forever. */
|
||||
while (1) {
|
||||
if (daemonize) {
|
||||
if (service_stopped())
|
||||
shutdwn(0);
|
||||
Sleep(3);
|
||||
service_stopped();
|
||||
} else {
|
||||
char buf[20];
|
||||
printf("\nEmpire Server>");
|
||||
|
|
|
@ -147,14 +147,13 @@ remove_service(char *service_name)
|
|||
}
|
||||
}
|
||||
|
||||
static SERVICE_STATUS service_status;
|
||||
static SERVICE_STATUS_HANDLE service_status_handle;
|
||||
static SERVICE_STATUS service_status;
|
||||
static SERVICE_STATUS_HANDLE service_status_handle;
|
||||
static HANDLE hShutdownEvent = NULL;
|
||||
|
||||
void WINAPI
|
||||
service_ctrl_handler(DWORD Opcode)
|
||||
{
|
||||
DWORD status;
|
||||
|
||||
switch(Opcode)
|
||||
{
|
||||
case SERVICE_CONTROL_PAUSE:
|
||||
|
@ -167,20 +166,9 @@ service_ctrl_handler(DWORD Opcode)
|
|||
service_status.dwCurrentState = SERVICE_RUNNING;
|
||||
break;
|
||||
|
||||
case SERVICE_CONTROL_STOP:
|
||||
service_status.dwWin32ExitCode = 0;
|
||||
service_status.dwCurrentState = SERVICE_STOPPED;
|
||||
service_status.dwCheckPoint = 0;
|
||||
service_status.dwWaitHint = 0;
|
||||
|
||||
if (!SetServiceStatus (service_status_handle,
|
||||
&service_status)) {
|
||||
status = GetLastError();
|
||||
logerror("Error while stopping service SetServiceStatus"
|
||||
" error %ld", status);
|
||||
}
|
||||
|
||||
logerror("Service stopped");
|
||||
case SERVICE_CONTROL_STOP:
|
||||
logerror("Service stopping");
|
||||
SetEvent(hShutdownEvent);
|
||||
return;
|
||||
|
||||
case SERVICE_CONTROL_INTERROGATE:
|
||||
|
@ -193,10 +181,8 @@ service_ctrl_handler(DWORD Opcode)
|
|||
}
|
||||
|
||||
/* Send current status. */
|
||||
if (!SetServiceStatus (service_status_handle, &service_status)) {
|
||||
status = GetLastError();
|
||||
logerror("SetServiceStatus error %ld",status);
|
||||
}
|
||||
if (!SetServiceStatus (service_status_handle, &service_status))
|
||||
logerror("SetServiceStatus error %ld",GetLastError());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -215,10 +201,17 @@ service_main(DWORD argc, LPTSTR *argv)
|
|||
DEFAULT_SERVICE_NAME, service_ctrl_handler);
|
||||
|
||||
if (service_status_handle == (SERVICE_STATUS_HANDLE)0) {
|
||||
logerror("RegisterServiceCtrlHandler failed %d\n", GetLastError());
|
||||
return;
|
||||
logerror("RegisterServiceCtrlHandler failed %d\n", GetLastError());
|
||||
loc_NTTerm();
|
||||
return;
|
||||
}
|
||||
|
||||
if ((hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) {
|
||||
logerror("CreateEvent for Shutdown failed %d\n", GetLastError());
|
||||
loc_NTTerm();
|
||||
return;
|
||||
}
|
||||
|
||||
start_server(0);
|
||||
|
||||
/* Initialization complete - report running status. */
|
||||
|
@ -236,19 +229,27 @@ service_main(DWORD argc, LPTSTR *argv)
|
|||
close_files();
|
||||
|
||||
loc_NTTerm();
|
||||
|
||||
/* This is where the service does its work. */
|
||||
logerror("Returning the Main Thread \n",0);
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
void
|
||||
service_stopped(void)
|
||||
{
|
||||
if (service_status.dwCurrentState == SERVICE_STOPPED)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
if (hShutdownEvent != NULL) {
|
||||
WaitForSingleObject(hShutdownEvent,INFINITE);
|
||||
shutdwn(0);
|
||||
logerror("Service stopped");
|
||||
service_status.dwWin32ExitCode = 0;
|
||||
service_status.dwCurrentState = SERVICE_STOPPED;
|
||||
service_status.dwCheckPoint = 0;
|
||||
service_status.dwWaitHint = 0;
|
||||
|
||||
if (!SetServiceStatus (service_status_handle,
|
||||
&service_status)) {
|
||||
logerror("Error while stopping service SetServiceStatus"
|
||||
" error %ld", GetLastError());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _WIN32 */
|
||||
|
|
|
@ -218,7 +218,7 @@ main(int argc, char **argv)
|
|||
*/
|
||||
if (GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) {
|
||||
logerror("Failed to dispatch service (%d)", GetLastError());
|
||||
printf("Failed to dispatch service (%d)\n", GetLastError());
|
||||
loc_NTTerm();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
@ -488,7 +488,14 @@ shutdwn(int sig)
|
|||
else
|
||||
logerror("Server shutting down at Deity's request");
|
||||
close_files();
|
||||
|
||||
#if defined(_WIN32)
|
||||
loc_NTTerm();
|
||||
if (!daemonize)
|
||||
_exit(0);
|
||||
#else
|
||||
_exit(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue