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