Module: wine Branch: master Commit: 9ff44b815b956aa228a63dfe48a224ed6c212dd4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9ff44b815b956aa228a63dfe48...
Author: Alexandre Julliard julliard@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 ); }