Alexandre Julliard : gdi32: Don' t hold the GDI lock while calling the UnrealizeObject method for GDI objects .
Module: wine Branch: master Commit: 9ff44b815b956aa228a63dfe48a224ed6c212dd4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9ff44b815b956aa228a63dfe48... Author: Alexandre Julliard <julliard(a)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 ); }
participants (1)
-
Alexandre Julliard