Implement delayed deletion of gdi objects. This is quite hacky and not 100% correct, but should hopefully fix the "Too many objects for process!!!" problem for now.

svn path=/trunk/; revision=40319
This commit is contained in:
Timo Kreuzer 2009-04-01 17:32:06 +00:00
parent 1b18546ca6
commit f854838a2c
2 changed files with 11 additions and 1 deletions

View file

@ -54,7 +54,10 @@ typedef struct _CLIENTOBJ
enum BASEFLAGS
{
BASEFLAG_LOOKASIDE = 0x80
BASEFLAG_LOOKASIDE = 0x80,
/* ReactOS specific: */
BASEFLAG_READY_TO_DIE = 0x1000
};
BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle);
@ -103,8 +106,14 @@ ULONG
FORCEINLINE
GDIOBJ_ShareUnlockObjByPtr(POBJ Object)
{
HGDIOBJ hobj = Object->hHmgr;
USHORT flags = Object->BaseFlags;
INT cLocks = InterlockedDecrement((PLONG)&Object->ulShareCount);
ASSERT(cLocks >= 0);
if ((flags & BASEFLAG_READY_TO_DIE) && (cLocks == 0))
{
GDIOBJ_FreeObjByHandle(hobj, GDI_OBJECT_TYPE_DONTCARE);
}
return cLocks;
}

View file

@ -574,6 +574,7 @@ LockHandle:
}
else if (Object->ulShareCount != 0)
{
Object->BaseFlags |= BASEFLAG_READY_TO_DIE;
DPRINT("Object %p, ulShareCount = %d\n", Object->hHmgr, Object->ulShareCount);
GDIDBG_TRACECALLER();
GDIDBG_TRACESHARELOCKER(GDI_HANDLE_GET_INDEX(hObj));