Alexandre Julliard : gdi32: Don't hold the GDI lock when calling DC_InitDC.

Alexandre Julliard julliard at winehq.org
Wed Feb 6 07:27:44 CST 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Feb  5 18:26:18 2008 +0100

gdi32: Don't hold the GDI lock when calling DC_InitDC.

---

 dlls/gdi32/bitmap.c |   27 ++++++++++++++++-----------
 1 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index de2fdae..a873457 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -576,13 +576,8 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
     BITMAPOBJ *bitmap;
     DC *dc;
 
-    if (!(bitmap = GDI_GetObjPtr( handle, BITMAP_MAGIC ))) return 0;
+    if (!(dc = get_dc_ptr( hdc ))) return 0;
 
-    if (!(dc = get_dc_ptr( hdc )))
-    {
-        GDI_ReleaseObj( handle );
-        return 0;
-    }
     if (GetObjectType( hdc ) != OBJ_MEMDC)
     {
         ret = 0;
@@ -591,34 +586,44 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
     ret = dc->hBitmap;
     if (handle == dc->hBitmap) goto done;  /* nothing to do */
 
+    if (!(bitmap = GDI_GetObjPtr( handle, BITMAP_MAGIC )))
+    {
+        ret = 0;
+        goto done;
+    }
+
     if (bitmap->header.dwCount && (handle != GetStockObject(DEFAULT_BITMAP)))
     {
         WARN( "Bitmap already selected in another DC\n" );
+        GDI_ReleaseObj( handle );
         ret = 0;
         goto done;
     }
 
     if (!bitmap->funcs && !BITMAP_SetOwnerDC( handle, dc ))
     {
+        GDI_ReleaseObj( handle );
         ret = 0;
         goto done;
     }
 
-    if (dc->funcs->pSelectBitmap) handle = dc->funcs->pSelectBitmap( dc->physDev, handle );
-
-    if (handle)
+    if (dc->funcs->pSelectBitmap && !dc->funcs->pSelectBitmap( dc->physDev, handle ))
+    {
+        GDI_ReleaseObj( handle );
+        ret = 0;
+    }
+    else
     {
         dc->hBitmap = handle;
         GDI_inc_ref_count( handle );
         dc->dirty = 0;
         SetRectRgn( dc->hVisRgn, 0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight);
+        GDI_ReleaseObj( handle );
         DC_InitDC( dc );
         GDI_dec_ref_count( ret );
     }
-    else ret = 0;
 
  done:
-    GDI_ReleaseObj( handle );
     release_dc_ptr( dc );
     return ret;
 }




More information about the wine-cvs mailing list