[4/7] services: Introduce refcounting for processes.
Sebastian Lackner
sebastian at fds-team.de
Tue Mar 15 22:31:31 CDT 2016
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
programs/services/services.c | 9 ++++++++-
programs/services/services.h | 2 ++
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/programs/services/services.c b/programs/services/services.c
index 03df852..1119b25 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -73,6 +73,7 @@ static DWORD process_create(struct process_entry **entry)
*entry = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(**entry));
if (!*entry)
return ERROR_NOT_ENOUGH_SERVER_MEMORY;
+ (*entry)->ref_count = 1;
(*entry)->control_pipe = INVALID_HANDLE_VALUE;
/* all other fields are zero */
return ERROR_SUCCESS;
@@ -126,7 +127,7 @@ void free_service_entry(struct service_entry *entry)
HeapFree(GetProcessHeap(), 0, entry->description);
HeapFree(GetProcessHeap(), 0, entry->dependOnServices);
HeapFree(GetProcessHeap(), 0, entry->dependOnGroups);
- free_process_entry(entry->process);
+ release_process(entry->process);
HeapFree(GetProcessHeap(), 0, entry);
}
@@ -455,6 +456,12 @@ struct service_entry *scmdatabase_find_service_by_displayname(struct scmdatabase
return NULL;
}
+void release_process(struct process_entry *process)
+{
+ if (InterlockedDecrement(&process->ref_count) == 0)
+ free_process_entry(process);
+}
+
void release_service(struct service_entry *service)
{
struct scmdatabase *db = service->db;
diff --git a/programs/services/services.h b/programs/services/services.h
index 206d655..b8f4774 100644
--- a/programs/services/services.h
+++ b/programs/services/services.h
@@ -33,6 +33,7 @@ struct scmdatabase
struct process_entry
{
+ LONG ref_count;
HANDLE process;
HANDLE control_mutex;
HANDLE control_pipe;
@@ -87,6 +88,7 @@ void service_terminate(struct service_entry *service);
/* Process functions */
+void release_process(struct process_entry *process);
BOOL process_send_command(struct process_entry *process, const void *data, DWORD size, DWORD *result);
extern HANDLE g_hStartedEvent;
--
2.7.1
More information about the wine-patches
mailing list