(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. */
while (1) {
if (daemonize) {
if (service_stopped())
shutdwn(0);
Sleep(3);
service_stopped();
} else {
char buf[20];
printf("\nEmpire Server>");

View file

@ -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 */

View file

@ -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
}