[2/5] services: Track number of services per process.
Sebastian Lackner
sebastian at fds-team.de
Thu Aug 18 02:27:58 CDT 2016
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
This will be required to shutdown winedevice services when they are no longer needed.
ref_count can contain a bigger value because of additional references (sending control
messages, asynchronous tasks, ...).
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;
--
2.9.0
More information about the wine-patches
mailing list