Sebastian Lackner : services: Add a grab_service function.

Alexandre Julliard julliard at winehq.org
Wed Aug 17 10:24:24 CDT 2016


Module: wine
Branch: master
Commit: 46a974856fee148a1006478df1978a82153fb9c2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=46a974856fee148a1006478df1978a82153fb9c2

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Wed Aug 17 09:12:27 2016 +0200

services: Add a grab_service function.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/services/rpc.c      |  4 +---
 programs/services/services.c | 13 +++++++++----
 programs/services/services.h |  1 +
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index 45366fb..eb8f4ff 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -373,9 +373,7 @@ DWORD __cdecl svcctl_OpenServiceW(
         return ERROR_INVALID_NAME;
 
     scmdatabase_lock(manager->db);
-    entry = scmdatabase_find_service(manager->db, lpServiceName);
-    if (entry != NULL)
-        InterlockedIncrement(&entry->ref_count);
+    entry = grab_service(scmdatabase_find_service(manager->db, lpServiceName));
     scmdatabase_unlock(manager->db);
 
     if (entry == NULL)
diff --git a/programs/services/services.c b/programs/services/services.c
index f7a2725..9be9bb8 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -346,15 +346,13 @@ static void scmdatabase_autostart_services(struct scmdatabase *db)
                     break;
                 services_list = slist_new;
             }
-            services_list[i] = service;
-            InterlockedIncrement(&service->ref_count);
-            i++;
+            services_list[i++] = grab_service(service);
         }
     }
+    size = i;
 
     scmdatabase_unlock(db);
 
-    size = i;
     for (i = 0; i < size; i++)
     {
         DWORD err;
@@ -494,6 +492,13 @@ void release_process(struct process_entry *process)
     scmdatabase_unlock(db);
 }
 
+struct service_entry *grab_service(struct service_entry *service)
+{
+    if (service)
+        InterlockedIncrement(&service->ref_count);
+    return service;
+}
+
 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 16f99f89..59d8d00 100644
--- a/programs/services/services.h
+++ b/programs/services/services.h
@@ -84,6 +84,7 @@ BOOL validate_service_name(LPCWSTR name);
 BOOL validate_service_config(struct service_entry *entry);
 DWORD save_service_config(struct service_entry *entry);
 void free_service_entry(struct service_entry *entry);
+struct service_entry *grab_service(struct service_entry *service);
 void release_service(struct service_entry *service);
 void service_lock(struct service_entry *service);
 void service_unlock(struct service_entry *service);




More information about the wine-cvs mailing list