(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:
Ron Koenderink 2005-03-12 04:35:09 +00:00
parent 6c7f707b76
commit 014d005c69
3 changed files with 42 additions and 36 deletions

View file

@ -473,9 +473,7 @@ empth_exit(void)
/* The main line. Wait forever. */ /* The main line. Wait forever. */
while (1) { while (1) {
if (daemonize) { if (daemonize) {
if (service_stopped()) service_stopped();
shutdwn(0);
Sleep(3);
} else { } else {
char buf[20]; char buf[20];
printf("\nEmpire Server>"); printf("\nEmpire Server>");

View file

@ -147,14 +147,13 @@ remove_service(char *service_name)
} }
} }
static SERVICE_STATUS service_status; static SERVICE_STATUS service_status;
static SERVICE_STATUS_HANDLE service_status_handle; static SERVICE_STATUS_HANDLE service_status_handle;
static HANDLE hShutdownEvent = NULL;
void WINAPI void WINAPI
service_ctrl_handler(DWORD Opcode) service_ctrl_handler(DWORD Opcode)
{ {
DWORD status;
switch(Opcode) switch(Opcode)
{ {
case SERVICE_CONTROL_PAUSE: case SERVICE_CONTROL_PAUSE:
@ -168,19 +167,8 @@ service_ctrl_handler(DWORD Opcode)
break; break;
case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_STOP:
service_status.dwWin32ExitCode = 0; logerror("Service stopping");
service_status.dwCurrentState = SERVICE_STOPPED; SetEvent(hShutdownEvent);
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");
return; return;
case SERVICE_CONTROL_INTERROGATE: case SERVICE_CONTROL_INTERROGATE:
@ -193,10 +181,8 @@ service_ctrl_handler(DWORD Opcode)
} }
/* Send current status. */ /* Send current status. */
if (!SetServiceStatus (service_status_handle, &service_status)) { if (!SetServiceStatus (service_status_handle, &service_status))
status = GetLastError(); logerror("SetServiceStatus error %ld",GetLastError());
logerror("SetServiceStatus error %ld",status);
}
return; return;
} }
@ -216,9 +202,16 @@ service_main(DWORD argc, LPTSTR *argv)
if (service_status_handle == (SERVICE_STATUS_HANDLE)0) { if (service_status_handle == (SERVICE_STATUS_HANDLE)0) {
logerror("RegisterServiceCtrlHandler failed %d\n", GetLastError()); logerror("RegisterServiceCtrlHandler failed %d\n", GetLastError());
loc_NTTerm();
return; return;
} }
if ((hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) {
logerror("CreateEvent for Shutdown failed %d\n", GetLastError());
loc_NTTerm();
return;
}
start_server(0); start_server(0);
/* Initialization complete - report running status. */ /* Initialization complete - report running status. */
@ -236,19 +229,27 @@ service_main(DWORD argc, LPTSTR *argv)
close_files(); close_files();
loc_NTTerm(); loc_NTTerm();
/* This is where the service does its work. */
logerror("Returning the Main Thread \n",0);
return; return;
} }
int void
service_stopped(void) service_stopped(void)
{ {
if (service_status.dwCurrentState == SERVICE_STOPPED) if (hShutdownEvent != NULL) {
return 1; WaitForSingleObject(hShutdownEvent,INFINITE);
else shutdwn(0);
return 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 */ #endif /* _WIN32 */

View file

@ -218,7 +218,7 @@ main(int argc, char **argv)
*/ */
if (GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { if (GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) {
logerror("Failed to dispatch service (%d)", GetLastError()); logerror("Failed to dispatch service (%d)", GetLastError());
printf("Failed to dispatch service (%d)\n", GetLastError()); loc_NTTerm();
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
@ -488,7 +488,14 @@ shutdwn(int sig)
else else
logerror("Server shutting down at Deity's request"); logerror("Server shutting down at Deity's request");
close_files(); close_files();
#if defined(_WIN32)
loc_NTTerm();
if (!daemonize)
_exit(0);
#else
_exit(0); _exit(0);
#endif
} }