[ros-diffs] [tkreuzer] 33995: - print out when process takes too much gdi handles - GDIOBJ_FreeObjByHandly: unlock handle table entry when object to delete was locked - REGION_AllocRgnWithHandle: unlock region before trying to delete it on failure Now gdi32_winetest clipping doesn't freeze ros anymore

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Mon Jun 16 20:27:18 CEST 2008


Author: tkreuzer
Date: Mon Jun 16 13:27:18 2008
New Revision: 33995

URL: http://svn.reactos.org/svn/reactos?rev=33995&view=rev
Log:
- print out when process takes too much gdi handles
- GDIOBJ_FreeObjByHandly: unlock handle table entry when object to delete was locked
- REGION_AllocRgnWithHandle: unlock region before trying to delete it on failure
Now gdi32_winetest clipping doesn't freeze ros anymore

Modified:
    trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c
    trunk/reactos/subsystems/win32/win32k/objects/region.c

Modified: trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c?rev=33995&r1=33994&r2=33995&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c [iso-8859-1] Mon Jun 16 13:27:18 2008
@@ -323,7 +323,11 @@
     /* HACK HACK HACK: simplest-possible quota implementation - don't allow a process
        to take too many GDI objects, itself. */
     if (W32Process && W32Process->GDIObjects >= 0x2710)
+    {
+        DPRINT1("Too many objects for process!!!\n");
+        GDIDBG_DUMPHANDLETABLE();
         return NULL;
+    }
 
     ASSERT(ObjectType != GDI_OBJECT_TYPE_DONTCARE);
 
@@ -539,6 +543,7 @@
                 DPRINT1("Object->cExclusiveLock = %d\n", Object->cExclusiveLock);
                 GDIDBG_TRACECALLER();
                 GDIDBG_TRACELOCKER(GDI_HANDLE_GET_INDEX(hObj));
+                (void)_InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId);
                 /* do not assert here for it will call again from dxg.sys it being call twice */
                 //ASSERT(FALSE);
             }

Modified: trunk/reactos/subsystems/win32/win32k/objects/region.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/region.c?rev=33995&r1=33994&r2=33995&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/region.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/region.c [iso-8859-1] Mon Jun 16 13:27:18 2008
@@ -2053,6 +2053,7 @@
         pReg->Buffer = ExAllocatePoolWithTag(PagedPool, nReg * sizeof(RECT), TAG_REGION);
         if (!pReg->Buffer)
         {
+            REGION_UnlockRgn(pReg);
             GDIOBJ_FreeObjByHandle(hReg, GDI_OBJECT_TYPE_REGION);
             return NULL;
         }



More information about the Ros-diffs mailing list