Alexandre Julliard : gdi32: Process the object HDC list outside of the critical section.

Alexandre Julliard julliard at winehq.org
Wed Oct 17 14:32:28 CDT 2012


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Oct 17 13:08:11 2012 +0200

gdi32: Process the object HDC list outside of the critical section.

---

 dlls/gdi32/gdiobj.c |   37 +++++++++++++++++--------------------
 1 files changed, 17 insertions(+), 20 deletions(-)

diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 750e95b..afc0c59 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -810,7 +810,7 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj )
 {
     struct gdi_handle_entry *entry;
     struct hdc_list *hdcs_head;
-    const struct gdi_obj_funcs *funcs;
+    const struct gdi_obj_funcs *funcs = NULL;
 
     EnterCriticalSection( &gdi_section );
     if (!(entry = handle_entry( obj )))
@@ -826,41 +826,38 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj )
 	return TRUE;
     }
 
-    while ((hdcs_head = entry->hdcs) != NULL)
+    hdcs_head = entry->hdcs;
+    entry->hdcs = NULL;
+
+    if (entry->obj->selcount)
     {
+        TRACE("delayed for %p because object in use, count %u\n", obj, entry->obj->selcount );
+        entry->obj->deleted = 1;  /* mark for delete */
+    }
+    else funcs = entry->funcs;
+
+    LeaveCriticalSection( &gdi_section );
+
+    while (hdcs_head)
+    {
+        struct hdc_list *next = hdcs_head->next;
         DC *dc = get_dc_ptr(hdcs_head->hdc);
 
-        entry->hdcs = hdcs_head->next;
         TRACE("hdc %p has interest in %p\n", hdcs_head->hdc, obj);
-
         if(dc)
         {
             PHYSDEV physdev = GET_DC_PHYSDEV( dc, pDeleteObject );
-            LeaveCriticalSection( &gdi_section );
             physdev->funcs->pDeleteObject( physdev, obj );
-            EnterCriticalSection( &gdi_section );  /* and grab it again */
-            entry = handle_entry( obj );
             release_dc_ptr( dc );
         }
         HeapFree(GetProcessHeap(), 0, hdcs_head);
-        if (!entry) return FALSE;
+        hdcs_head = next;
     }
 
-    if (entry->obj->selcount)
-    {
-        TRACE("delayed for %p because object in use, count %u\n", obj, entry->obj->selcount );
-        entry->obj->deleted = 1;  /* mark for delete */
-        LeaveCriticalSection( &gdi_section );
-        return TRUE;
-    }
-
-    funcs = entry->funcs;
-    LeaveCriticalSection( &gdi_section );
-
     TRACE("%p\n", obj );
 
     if (funcs && funcs->pDeleteObject) return funcs->pDeleteObject( obj );
-    return FALSE;
+    return TRUE;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list