- add tracing of exclusive gdi locks
- add some asserts

svn path=/trunk/; revision=50825
This commit is contained in:
Timo Kreuzer 2011-02-19 22:03:34 +00:00
parent dc29559c25
commit ebf22c9469
3 changed files with 44 additions and 7 deletions

View file

@ -9,6 +9,9 @@
#include <win32k/ntgdihdl.h>
#include "win32.h"
/* apparently the first 10 entries are never used in windows as they are empty */
#define RESERVE_ENTRIES_COUNT 10
typedef struct _GDI_HANDLE_TABLE
{
/* The table must be located at the beginning of this structure so it can be
@ -105,6 +108,19 @@ ULONG
FORCEINLINE
GDIOBJ_UnlockObjByPtr(POBJ Object)
{
#if DBG
PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread();
if (pti)
{
if (pti->cExclusiveLocks < 1)
{
DbgPrint("cExclusiveLocks = %ld, object: %ld\n",
pti->cExclusiveLocks, Object->cExclusiveLock);
ASSERT(FALSE);
}
pti->cExclusiveLocks--;
}
#endif
INT cLocks = InterlockedDecrement((PLONG)&Object->cExclusiveLock);
ASSERT(cLocks >= 0);
return cLocks;
@ -120,6 +136,7 @@ GDIOBJ_ShareUnlockObjByPtr(POBJ Object)
ASSERT(cLocks >= 0);
if ((flags & BASEFLAG_READY_TO_DIE) && (cLocks == 0))
{
ASSERT(Object->cExclusiveLock == 0);
GDIOBJ_SetOwnership(hobj, PsGetCurrentProcess());
GDIOBJ_FreeObjByHandle(hobj, GDI_OBJECT_TYPE_DONTCARE);
}

View file

@ -38,7 +38,7 @@ InitUserAtoms(VOID)
gpsi->atomSysClass[ICLS_SWITCH] = 32771;
gpsi->atomSysClass[ICLS_ICONTITLE] = 32772;
gpsi->atomSysClass[ICLS_TOOLTIPS] = 32774;
/* System Message Atom */
AtomMessage = IntAddGlobalAtom(L"Message", TRUE);
gpsi->atomSysClass[ICLS_HWNDMESSAGE] = AtomMessage;
@ -112,7 +112,7 @@ UserInitialize(
// {
GetW32ThreadInfo();
// Callback to User32 Client Thread Setup
co_IntClientThreadSetup();
@ -208,12 +208,14 @@ VOID FASTCALL UserEnterShared(VOID)
VOID FASTCALL UserEnterExclusive(VOID)
{
ASSERT_NOGDILOCKS();
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&UserLock, TRUE);
}
VOID FASTCALL UserLeave(VOID)
{
ASSERT_NOGDILOCKS();
ExReleaseResourceLite(&UserLock);
KeLeaveCriticalRegion();
}

View file

@ -17,9 +17,6 @@
#define GDI_HANDLE_GET_ENTRY(HandleTable, h) \
(&(HandleTable)->Entries[GDI_HANDLE_GET_INDEX((h))])
/* apparently the first 10 entries are never used in windows as they are empty */
#define RESERVE_ENTRIES_COUNT 10
#define BASE_OBJTYPE_COUNT 32
#define DelayExecution() \
@ -483,6 +480,9 @@ LockHandle:
newObject->ulShareCount = 0;
newObject->cExclusiveLock = 1;
newObject->Tid = Thread;
#if DBG
if (Thread) Thread->cExclusiveLocks++;
#endif
AllocTypeDataDump(TypeInfo);
@ -603,11 +603,11 @@ LockHandle:
((Entry->Type & GDI_ENTRY_BASETYPE_MASK) == (HandleUpper & GDI_ENTRY_BASETYPE_MASK)) )
{
POBJ Object;
PTHREADINFO Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread();
Object = Entry->KernelData;
if ((Object->cExclusiveLock == 0 ||
Object->Tid == (PTHREADINFO)PsGetCurrentThreadWin32Thread()) &&
if ((Object->cExclusiveLock == 0 || Object->Tid == Thread) &&
Object->ulShareCount == 0)
{
BOOL Ret;
@ -623,6 +623,18 @@ LockHandle:
InterlockedPushFreeEntry(GDI_ENTRY_TO_INDEX(GdiHandleTable, Entry));
Object->hHmgr = NULL;
#if DBG
if (Thread)
{
if (Thread->cExclusiveLocks < Object->cExclusiveLock)
{
DPRINT1("cExclusiveLocks = %ld, object: %ld\n",
Thread->cExclusiveLocks, Object->cExclusiveLock);
ASSERT(FALSE);
}
Thread->cExclusiveLocks -= Object->cExclusiveLock;
}
#endif
if (W32Process != NULL)
{
@ -1056,6 +1068,9 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ExpectedType)
Object->Tid = Thread;
Object->cExclusiveLock = 1;
GDIDBG_CAPTURELOCKER(GDI_HANDLE_GET_INDEX(hObj))
#if DBG
if (Thread) Thread->cExclusiveLocks++;
#endif
}
else
{
@ -1068,6 +1083,9 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ExpectedType)
continue;
}
InterlockedIncrement((PLONG)&Object->cExclusiveLock);
#if DBG
if (Thread) Thread->cExclusiveLocks++;
#endif
}
}
else