mirror of
https://github.com/reactos/reactos.git
synced 2025-05-20 17:45:06 +00:00
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:
parent
1b18546ca6
commit
f854838a2c
2 changed files with 11 additions and 1 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue