Alexandre Julliard : gdi32: Don' t hold the GDI lock while calling the UnrealizeObject method for GDI objects .
Alexandre Julliard
julliard at winehq.org
Wed Jan 28 08:02:49 CST 2009
Module: wine
Branch: master
Commit: 9ff44b815b956aa228a63dfe48a224ed6c212dd4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9ff44b815b956aa228a63dfe48a224ed6c212dd4
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 27 16:26:35 2009 +0100
gdi32: Don't hold the GDI lock while calling the UnrealizeObject method for GDI objects.
---
dlls/gdi32/gdi_private.h | 2 +-
dlls/gdi32/gdiobj.c | 21 ++++++++++-----------
dlls/gdi32/palette.c | 22 +++++++++++-----------
3 files changed, 22 insertions(+), 23 deletions(-)
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index b5cb04c..9cb3796 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -74,7 +74,7 @@ struct gdi_obj_funcs
HGDIOBJ (*pSelectObject)( HGDIOBJ handle, HDC hdc );
INT (*pGetObjectA)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
INT (*pGetObjectW)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
- BOOL (*pUnrealizeObject)( HGDIOBJ handle, void *obj );
+ BOOL (*pUnrealizeObject)( HGDIOBJ handle );
BOOL (*pDeleteObject)( HGDIOBJ handle );
};
diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 77cb23f..080632a 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -1145,20 +1145,19 @@ HGDIOBJ WINAPI SelectObject( HDC hdc, HGDIOBJ hObj )
*/
BOOL WINAPI UnrealizeObject( HGDIOBJ obj )
{
- BOOL result = TRUE;
- /* Check if object is valid */
-
+ BOOL result = FALSE;
GDIOBJHDR * header = GDI_GetObjPtr( obj, MAGIC_DONTCARE );
- if (!header) return FALSE;
-
- TRACE("%p\n", obj );
- /* Unrealize object */
-
- if (header->funcs && header->funcs->pUnrealizeObject)
- result = header->funcs->pUnrealizeObject( obj, header );
+ if (header)
+ {
+ const struct gdi_obj_funcs *funcs = header->funcs;
- GDI_ReleaseObj( obj );
+ GDI_ReleaseObj( obj );
+ if (funcs && funcs->pUnrealizeObject)
+ result = header->funcs->pUnrealizeObject( obj );
+ else
+ result = TRUE;
+ }
return result;
}
diff --git a/dlls/gdi32/palette.c b/dlls/gdi32/palette.c
index c184862..35f6f71 100644
--- a/dlls/gdi32/palette.c
+++ b/dlls/gdi32/palette.c
@@ -46,7 +46,7 @@ typedef struct tagPALETTEOBJ
} PALETTEOBJ;
static INT PALETTE_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
-static BOOL PALETTE_UnrealizeObject( HGDIOBJ handle, void *obj );
+static BOOL PALETTE_UnrealizeObject( HGDIOBJ handle );
static BOOL PALETTE_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs palette_funcs =
@@ -374,12 +374,11 @@ BOOL WINAPI ResizePalette(
if (!(palPtr = GDI_ReallocObject( size, hPal, palPtr ))) return FALSE;
- PALETTE_UnrealizeObject( hPal, palPtr );
-
if( cEntries > cPrevEnt ) memset( (BYTE*)palPtr + prevsize, 0, size - prevsize );
palPtr->logpalette.palNumEntries = cEntries;
palPtr->logpalette.palVersion = prevVer;
GDI_ReleaseObj( hPal );
+ PALETTE_UnrealizeObject( hPal );
return TRUE;
}
@@ -647,15 +646,16 @@ static INT PALETTE_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffe
/***********************************************************************
* PALETTE_UnrealizeObject
*/
-static BOOL PALETTE_UnrealizeObject( HGDIOBJ handle, void *obj )
+static BOOL PALETTE_UnrealizeObject( HGDIOBJ handle )
{
- PALETTEOBJ *palette = obj;
+ PALETTEOBJ *palette = GDI_GetObjPtr( handle, PALETTE_MAGIC );
- if (palette->funcs)
+ if (palette)
{
- if (palette->funcs->pUnrealizePalette)
- palette->funcs->pUnrealizePalette( handle );
+ const DC_FUNCTIONS *funcs = palette->funcs;
palette->funcs = NULL;
+ GDI_ReleaseObj( handle );
+ if (funcs && funcs->pUnrealizePalette) funcs->pUnrealizePalette( handle );
}
if (InterlockedCompareExchangePointer( (void **)&hLastRealizedPalette, 0, handle ) == handle)
@@ -670,10 +670,10 @@ static BOOL PALETTE_UnrealizeObject( HGDIOBJ handle, void *obj )
*/
static BOOL PALETTE_DeleteObject( HGDIOBJ handle )
{
- PALETTEOBJ *obj = GDI_GetObjPtr( handle, PALETTE_MAGIC );
+ PALETTEOBJ *obj;
- if (!obj) return FALSE;
- PALETTE_UnrealizeObject( handle, obj );
+ PALETTE_UnrealizeObject( handle );
+ if (!(obj = GDI_GetObjPtr( handle, PALETTE_MAGIC ))) return FALSE;
return GDI_FreeObject( handle, obj );
}
More information about the wine-cvs
mailing list