Sebastian Lackner : services: Hold scmdatabase lock while checking marked_for_delete.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 16 11:36:40 CDT 2016


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

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Wed Mar 16 04:30:39 2016 +0100

services: Hold scmdatabase lock while checking marked_for_delete.

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

---

 programs/services/services.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/programs/services/services.c b/programs/services/services.c
index 78baaf2..9f7e889 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -456,13 +456,15 @@ struct service_entry *scmdatabase_find_service_by_displayname(struct scmdatabase
 
 void release_service(struct service_entry *service)
 {
+    struct scmdatabase *db = service->db;
+
+    scmdatabase_lock(db);
     if (InterlockedDecrement(&service->ref_count) == 0 && is_marked_for_delete(service))
     {
-        scmdatabase_lock(service->db);
-        scmdatabase_remove_service(service->db, service);
-        scmdatabase_unlock(service->db);
+        scmdatabase_remove_service(db, service);
         free_service_entry(service);
     }
+    scmdatabase_unlock(db);
 }
 
 static DWORD scmdatabase_create(struct scmdatabase **db)




More information about the wine-cvs mailing list