Implement exclusive lock order checks for GDI objects in debug builds

svn path=/trunk/; revision=65731
This commit is contained in:
Timo Kreuzer 2014-12-18 08:12:28 +00:00
parent c6f684e727
commit 72bceaffc2

View file

@ -71,6 +71,22 @@ DECREASE_THREAD_LOCK_COUNT(
}
#if DBG
VOID
ASSERT_LOCK_ORDER(
_In_ UCHAR objt)
{
PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
ULONG i;
if (pti)
{
/* Ensure correct locking order! */
for (i = objt + 1; i < GDIObjTypeTotal; i++)
{
NT_ASSERT(pti->acExclusiveLockCount[i] == 0);
}
}
}
#define ASSERT_SHARED_OBJECT_TYPE(objt) \
ASSERT((objt) == GDIObjType_SURF_TYPE || \
(objt) == GDIObjType_PAL_TYPE || \
@ -83,6 +99,7 @@ DECREASE_THREAD_LOCK_COUNT(
#define ASSERT_TRYLOCK_OBJECT_TYPE(objt) \
ASSERT((objt) == GDIObjType_DRVOBJ_TYPE)
#else
#define ASSERT_LOCK_ORDER(hobj)
#define ASSERT_SHARED_OBJECT_TYPE(objt)
#define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt)
#define ASSERT_TRYLOCK_OBJECT_TYPE(objt)
@ -669,6 +686,9 @@ GDIOBJ_TryLockObject(
return NULL;
}
/* Make sure lock order is correct */
ASSERT_LOCK_ORDER(objt);
/* Reference the handle entry */
pentry = ENTRY_ReferenceEntryByHandle(hobj, 0);
if (!pentry)
@ -735,6 +755,9 @@ GDIOBJ_LockObject(
return NULL;
}
/* Make sure lock order is correct */
ASSERT_LOCK_ORDER(objt);
/* Reference the handle entry */
pentry = ENTRY_ReferenceEntryByHandle(hobj, 0);
if (!pentry)