Alexandre Julliard : user32: Completely free owned DCEs when the corresponding window/ class is destroyed.

Alexandre Julliard julliard at winehq.org
Mon Aug 22 07:32:37 CDT 2016


Module: wine
Branch: stable
Commit: 251a085f2ab364e90888430cedb4b480c97f286d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=251a085f2ab364e90888430cedb4b480c97f286d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat May 21 09:54:40 2016 +0900

user32: Completely free owned DCEs when the corresponding window/class is destroyed.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit d341b0c3815a1b8872c8354dd0811e05a1ce7152)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/gdi32/tests/dc.c  |  1 -
 dlls/user32/painting.c | 16 ++++++++++++----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c
index cb42219..0fd6326 100644
--- a/dlls/gdi32/tests/dc.c
+++ b/dlls/gdi32/tests/dc.c
@@ -830,7 +830,6 @@ static void test_DeleteDC(void)
     ok(ret, "UnregisterClassA failed\n");
 
     ret = GetObjectType(hdc_test);
-todo_wine
     ok(!ret, "GetObjectType should fail for a deleted DC\n");
 
     /* CS_OWNDC */
diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c
index 1dea98d..1c4ca7c 100644
--- a/dlls/user32/painting.c
+++ b/dlls/user32/painting.c
@@ -339,16 +339,17 @@ static struct dce *get_window_dce( HWND hwnd )
  */
 void free_dce( struct dce *dce, HWND hwnd )
 {
+    struct dce *dce_to_free = NULL;
+
     USER_Lock();
 
     if (dce)
     {
         if (!--dce->count)
         {
-            /* turn it into a cache entry */
-            SetHookFlags( dce->hdc, DCHF_RESETDC );
             release_dce( dce );
-            dce->flags |= DCX_CACHE;
+            list_remove( &dce->entry );
+            dce_to_free = dce;
         }
         else if (dce->hwnd == hwnd)
         {
@@ -363,7 +364,7 @@ void free_dce( struct dce *dce, HWND hwnd )
         LIST_FOR_EACH_ENTRY( dce, &dce_list, struct dce, entry )
         {
             if (dce->hwnd != hwnd) continue;
-            if (!(dce->flags & DCX_CACHE)) continue;
+            if (!(dce->flags & DCX_CACHE)) break;
 
             if (dce->count) WARN( "GetDC() without ReleaseDC() for window %p\n", hwnd );
             dce->count = 0;
@@ -372,6 +373,13 @@ void free_dce( struct dce *dce, HWND hwnd )
     }
 
     USER_Unlock();
+
+    if (dce_to_free)
+    {
+        SetDCHook( dce_to_free->hdc, NULL, 0 );
+        DeleteDC( dce_to_free->hdc );
+        HeapFree( GetProcessHeap(), 0, dce_to_free );
+    }
 }
 
 




More information about the wine-cvs mailing list