Alexandre Julliard : gdi32: Don' t hold the GDI lock while calling the driver SelectFont function.

Alexandre Julliard julliard at winehq.org
Thu Sep 27 14:48:52 CDT 2007


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Sep 27 21:01:00 2007 +0200

gdi32: Don't hold the GDI lock while calling the driver SelectFont function.

---

 dlls/gdi32/font.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 826e331..3b6ec3b 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -588,14 +588,24 @@ HFONT WINAPI CreateFontW( INT height, INT width, INT esc,
 static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, HDC hdc )
 {
     HGDIOBJ ret = 0;
-    DC *dc = DC_GetDCPtr( hdc );
+    DC *dc = get_dc_ptr( hdc );
 
     if (!dc) return 0;
 
+    if (!GDI_inc_ref_count( handle ))
+    {
+        release_dc_ptr( dc );
+        return 0;
+    }
+
     if (dc->hFont != handle || dc->gdiFont == NULL)
     {
         if(GetDeviceCaps(dc->hSelf, TEXTCAPS) & TC_VA_ABLE)
+        {
+            FONTOBJ *font = GDI_GetObjPtr( handle, FONT_MAGIC );  /* to grab the GDI lock (FIXME) */
             dc->gdiFont = WineEngCreateFontInstance(dc, handle);
+            if (font) GDI_ReleaseObj( handle );
+        }
     }
 
     if (dc->funcs->pSelectFont) ret = dc->funcs->pSelectFont( dc->physDev, handle, dc->gdiFont );
@@ -603,15 +613,17 @@ static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, HDC hdc )
     if (ret && dc->gdiFont) dc->gdiFont = 0;
 
     if (ret == HGDI_ERROR)
+    {
+        GDI_dec_ref_count( handle );
         ret = 0; /* SelectObject returns 0 on error */
+    }
     else
     {
         ret = dc->hFont;
         dc->hFont = handle;
-        GDI_inc_ref_count( handle );
         GDI_dec_ref_count( ret );
     }
-    DC_ReleaseDCPtr( dc );
+    release_dc_ptr( dc );
     return ret;
 }
 




More information about the wine-cvs mailing list