Alexandre Julliard : gdi32: Release the GDI lock when calling the DC DeleteObject function.
Alexandre Julliard
julliard at winehq.org
Wed Jan 28 08:02:49 CST 2009
Module: wine
Branch: master
Commit: b4255d295df209c1468f199e20a3a1ae75ae9c6a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4255d295df209c1468f199e20a3a1ae75ae9c6a
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 27 16:15:47 2009 +0100
gdi32: Release the GDI lock when calling the DC DeleteObject function.
---
dlls/gdi32/gdiobj.c | 19 ++++++++++++-------
1 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 906cd2a..7b5981b 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -808,6 +808,7 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj )
{
/* Check if object is valid */
+ struct hdc_list *hdcs_head;
GDIOBJHDR * header;
if (HIWORD(obj)) return FALSE;
@@ -821,21 +822,25 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj )
return TRUE;
}
- while (header->hdcs)
+ while ((hdcs_head = header->hdcs) != NULL)
{
- DC *dc = get_dc_ptr(header->hdcs->hdc);
- struct hdc_list *tmp;
+ DC *dc = get_dc_ptr(hdcs_head->hdc);
+
+ header->hdcs = hdcs_head->next;
+ TRACE("hdc %p has interest in %p\n", hdcs_head->hdc, obj);
- TRACE("hdc %p has interest in %p\n", header->hdcs->hdc, obj);
if(dc)
{
if(dc->funcs->pDeleteObject)
+ {
+ GDI_ReleaseObj( obj ); /* release the GDI lock */
dc->funcs->pDeleteObject( dc->physDev, obj );
+ header = GDI_GetObjPtr( obj, MAGIC_DONTCARE ); /* and grab it again */
+ }
release_dc_ptr( dc );
}
- tmp = header->hdcs;
- header->hdcs = header->hdcs->next;
- HeapFree(GetProcessHeap(), 0, tmp);
+ HeapFree(GetProcessHeap(), 0, hdcs_head);
+ if (!header) return FALSE;
}
if (header->dwCount)
More information about the wine-cvs
mailing list