advapi32: Do not stop service main thread as long as there are still running services.
Signed-off-by: Sebastian Lackner <sebastian@fds-team.de> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
13bb213aeb
commit
2263baaf2e
|
@ -96,7 +96,7 @@ static CRITICAL_SECTION service_cs = { &service_cs_debug, -1, 0, 0, 0, 0 };
|
||||||
static service_data **services;
|
static service_data **services;
|
||||||
static unsigned int nb_services;
|
static unsigned int nb_services;
|
||||||
static HANDLE service_event;
|
static HANDLE service_event;
|
||||||
static HANDLE stop_event;
|
static BOOL stop_service;
|
||||||
|
|
||||||
extern HANDLE CDECL __wine_make_process_system(void);
|
extern HANDLE CDECL __wine_make_process_system(void);
|
||||||
|
|
||||||
|
@ -546,22 +546,21 @@ static BOOL service_run_main_thread(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
service_event = CreateEventW( NULL, FALSE, FALSE, NULL );
|
service_event = CreateEventW( NULL, FALSE, FALSE, NULL );
|
||||||
stop_event = CreateEventW( NULL, FALSE, FALSE, NULL );
|
stop_service = FALSE;
|
||||||
|
|
||||||
/* FIXME: service_control_dispatcher should be merged into the main thread */
|
/* FIXME: service_control_dispatcher should be merged into the main thread */
|
||||||
wait_handles[0] = __wine_make_process_system();
|
wait_handles[0] = __wine_make_process_system();
|
||||||
wait_handles[1] = CreateThread( NULL, 0, service_control_dispatcher, disp, 0, NULL );
|
wait_handles[1] = CreateThread( NULL, 0, service_control_dispatcher, disp, 0, NULL );
|
||||||
wait_handles[2] = service_event;
|
wait_handles[2] = service_event;
|
||||||
wait_handles[3] = stop_event;
|
|
||||||
|
|
||||||
TRACE("Starting %d services running as process %d\n",
|
TRACE("Starting %d services running as process %d\n",
|
||||||
nb_services, GetCurrentProcessId());
|
nb_services, GetCurrentProcessId());
|
||||||
|
|
||||||
/* wait for all the threads to pack up and exit */
|
/* wait for all the threads to pack up and exit */
|
||||||
for (;;)
|
while (!stop_service)
|
||||||
{
|
{
|
||||||
EnterCriticalSection( &service_cs );
|
EnterCriticalSection( &service_cs );
|
||||||
for (i = 0, n = 4; i < nb_services && n < MAXIMUM_WAIT_OBJECTS; i++)
|
for (i = 0, n = 3; i < nb_services && n < MAXIMUM_WAIT_OBJECTS; i++)
|
||||||
{
|
{
|
||||||
if (!services[i]->thread) continue;
|
if (!services[i]->thread) continue;
|
||||||
wait_services[n] = i;
|
wait_services[n] = i;
|
||||||
|
@ -619,10 +618,6 @@ static BOOL service_run_main_thread(void)
|
||||||
{
|
{
|
||||||
continue; /* rebuild the list */
|
continue; /* rebuild the list */
|
||||||
}
|
}
|
||||||
else if (ret == 3)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else if (ret < n)
|
else if (ret < n)
|
||||||
{
|
{
|
||||||
i = wait_services[ret];
|
i = wait_services[ret];
|
||||||
|
@ -633,6 +628,8 @@ static BOOL service_run_main_thread(void)
|
||||||
}
|
}
|
||||||
else return FALSE;
|
else return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -810,9 +807,21 @@ SetServiceStatus( SERVICE_STATUS_HANDLE hService, LPSERVICE_STATUS lpStatus )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lpStatus->dwCurrentState == SERVICE_STOPPED) {
|
if (lpStatus->dwCurrentState == SERVICE_STOPPED)
|
||||||
SetEvent(stop_event);
|
{
|
||||||
CloseServiceHandle((SC_HANDLE)hService);
|
unsigned int i, count = 0;
|
||||||
|
EnterCriticalSection( &service_cs );
|
||||||
|
for (i = 0; i < nb_services; i++)
|
||||||
|
{
|
||||||
|
if (services[i]->handle == (SC_HANDLE)hService) continue;
|
||||||
|
if (services[i]->thread) count++;
|
||||||
|
}
|
||||||
|
if (!count)
|
||||||
|
{
|
||||||
|
stop_service = TRUE;
|
||||||
|
SetEvent( service_event ); /* notify the main loop */
|
||||||
|
}
|
||||||
|
LeaveCriticalSection( &service_cs );
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
Loading…
Reference in New Issue