services: Track number of services per process.

Signed-off-by: Sebastian Lackner <sebastian@fds-team.de>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Sebastian Lackner 2016-08-18 09:27:58 +02:00 committed by Alexandre Julliard
parent b08ce1ae80
commit 36ccc45db6
3 changed files with 12 additions and 3 deletions

View File

@ -761,6 +761,7 @@ DWORD __cdecl svcctl_SetServiceStatus(
if (lpServiceStatus->dwCurrentState == SERVICE_STOPPED) if (lpServiceStatus->dwCurrentState == SERVICE_STOPPED)
{ {
service->service_entry->process = NULL; service->service_entry->process = NULL;
if (!--process->use_count)
terminate_after_timeout(process, service_kill_timeout); terminate_after_timeout(process, service_kill_timeout);
release_process(process); release_process(process);
} }
@ -1135,7 +1136,11 @@ DWORD __cdecl svcctl_ControlService(
{ {
result = ERROR_SERVICE_CANNOT_ACCEPT_CTRL; result = ERROR_SERVICE_CANNOT_ACCEPT_CTRL;
if ((process = service->service_entry->process)) if ((process = service->service_entry->process))
process_terminate(process); {
service->service_entry->process = NULL;
if (!--process->use_count) process_terminate(process);
release_process(process);
}
} }
if (result != ERROR_SUCCESS) if (result != ERROR_SUCCESS)

View File

@ -752,8 +752,9 @@ static DWORD service_start_process(struct service_entry *service_entry, struct p
service_unlock(service_entry); service_unlock(service_entry);
return ERROR_SERVICE_ALREADY_RUNNING; return ERROR_SERVICE_ALREADY_RUNNING;
} }
release_process(process);
service_entry->process = NULL; service_entry->process = NULL;
process->use_count--;
release_process(process);
} }
service_entry->force_shutdown = FALSE; service_entry->force_shutdown = FALSE;
@ -784,6 +785,7 @@ static DWORD service_start_process(struct service_entry *service_entry, struct p
service_entry->status.dwCurrentState = SERVICE_START_PENDING; service_entry->status.dwCurrentState = SERVICE_START_PENDING;
scmdatabase_add_process(service_entry->db, process); scmdatabase_add_process(service_entry->db, process);
service_entry->process = grab_process(process); service_entry->process = grab_process(process);
process->use_count++;
service_unlock(service_entry); service_unlock(service_entry);
@ -945,6 +947,7 @@ void process_terminate(struct process_entry *process)
if (service->process != process) continue; if (service->process != process) continue;
service->status.dwCurrentState = SERVICE_STOPPED; service->status.dwCurrentState = SERVICE_STOPPED;
service->process = NULL; service->process = NULL;
process->use_count--;
release_process(process); release_process(process);
} }
scmdatabase_unlock(db); scmdatabase_unlock(db);

View File

@ -37,6 +37,7 @@ struct process_entry
struct list entry; struct list entry;
struct scmdatabase *db; struct scmdatabase *db;
LONG ref_count; LONG ref_count;
LONG use_count;
DWORD process_id; DWORD process_id;
HANDLE process; HANDLE process;
HANDLE control_mutex; HANDLE control_mutex;