Module: wine Branch: master Commit: 36ccc45db600f71b59c939988f06ee96427791c2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=36ccc45db600f71b59c939988f...
Author: Sebastian Lackner sebastian@fds-team.de Date: Thu Aug 18 09:27:58 2016 +0200
services: Track number of services per process.
Signed-off-by: Sebastian Lackner sebastian@fds-team.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
programs/services/rpc.c | 9 +++++++-- programs/services/services.c | 5 ++++- programs/services/services.h | 1 + 3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/programs/services/rpc.c b/programs/services/rpc.c index 64d5879..977ddb6 100644 --- a/programs/services/rpc.c +++ b/programs/services/rpc.c @@ -761,7 +761,8 @@ DWORD __cdecl svcctl_SetServiceStatus( if (lpServiceStatus->dwCurrentState == SERVICE_STOPPED) { service->service_entry->process = NULL; - terminate_after_timeout(process, service_kill_timeout); + if (!--process->use_count) + terminate_after_timeout(process, service_kill_timeout); release_process(process); } else @@ -1135,7 +1136,11 @@ DWORD __cdecl svcctl_ControlService( { result = ERROR_SERVICE_CANNOT_ACCEPT_CTRL; 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) diff --git a/programs/services/services.c b/programs/services/services.c index 9be9bb8..177acf1 100644 --- a/programs/services/services.c +++ b/programs/services/services.c @@ -752,8 +752,9 @@ static DWORD service_start_process(struct service_entry *service_entry, struct p service_unlock(service_entry); return ERROR_SERVICE_ALREADY_RUNNING; } - release_process(process); service_entry->process = NULL; + process->use_count--; + release_process(process); }
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; scmdatabase_add_process(service_entry->db, process); service_entry->process = grab_process(process); + process->use_count++;
service_unlock(service_entry);
@@ -945,6 +947,7 @@ void process_terminate(struct process_entry *process) if (service->process != process) continue; service->status.dwCurrentState = SERVICE_STOPPED; service->process = NULL; + process->use_count--; release_process(process); } scmdatabase_unlock(db); diff --git a/programs/services/services.h b/programs/services/services.h index 59d8d00..a3ecdf2 100644 --- a/programs/services/services.h +++ b/programs/services/services.h @@ -37,6 +37,7 @@ struct process_entry struct list entry; struct scmdatabase *db; LONG ref_count; + LONG use_count; DWORD process_id; HANDLE process; HANDLE control_mutex;