Rob Shearman : services: Add a ref count to the service entry in svcctl_CreateServiceW.
Alexandre Julliard
julliard at winehq.org
Tue Mar 24 09:01:59 CDT 2009
Module: wine
Branch: master
Commit: 8f07e6932b23acf5a3233dc55bbe7a426f35fc28
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f07e6932b23acf5a3233dc55bbe7a426f35fc28
Author: Rob Shearman <robertshearman at gmail.com>
Date: Tue Mar 24 11:25:35 2009 +0000
services: Add a ref count to the service entry in svcctl_CreateServiceW.
The ref count will be released by SC_RPC_HANDLE_destroy when the
returned handle is destroyed.
Change svcctl_OpenServiceW to use InterlockedIncrement to increment
the ref count since the service is in the database and therefore could
be shared and SC_RPC_HANDLE_destroy doesn't take the scmdatabase lock
when decrementing the ref count.
---
programs/services/rpc.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index 7c09f55..22391c2 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -309,7 +309,7 @@ DWORD svcctl_OpenServiceW(
scmdatabase_lock_shared(manager->db);
entry = scmdatabase_find_service(manager->db, lpServiceName);
if (entry != NULL)
- entry->ref_count++;
+ InterlockedIncrement(&entry->ref_count);
scmdatabase_unlock(manager->db);
if (entry == NULL)
@@ -358,6 +358,7 @@ DWORD svcctl_CreateServiceW(
err = service_create(lpServiceName, &entry);
if (err != ERROR_SUCCESS)
return err;
+ entry->ref_count = 1;
entry->config.dwServiceType = entry->status.dwServiceType = dwServiceType;
entry->config.dwStartType = dwStartType;
entry->config.dwErrorControl = dwErrorControl;
More information about the wine-cvs
mailing list