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 #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) \ #define ASSERT_SHARED_OBJECT_TYPE(objt) \
ASSERT((objt) == GDIObjType_SURF_TYPE || \ ASSERT((objt) == GDIObjType_SURF_TYPE || \
(objt) == GDIObjType_PAL_TYPE || \ (objt) == GDIObjType_PAL_TYPE || \
@ -83,6 +99,7 @@ DECREASE_THREAD_LOCK_COUNT(
#define ASSERT_TRYLOCK_OBJECT_TYPE(objt) \ #define ASSERT_TRYLOCK_OBJECT_TYPE(objt) \
ASSERT((objt) == GDIObjType_DRVOBJ_TYPE) ASSERT((objt) == GDIObjType_DRVOBJ_TYPE)
#else #else
#define ASSERT_LOCK_ORDER(hobj)
#define ASSERT_SHARED_OBJECT_TYPE(objt) #define ASSERT_SHARED_OBJECT_TYPE(objt)
#define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt) #define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt)
#define ASSERT_TRYLOCK_OBJECT_TYPE(objt) #define ASSERT_TRYLOCK_OBJECT_TYPE(objt)
@ -669,6 +686,9 @@ GDIOBJ_TryLockObject(
return NULL; return NULL;
} }
/* Make sure lock order is correct */
ASSERT_LOCK_ORDER(objt);
/* Reference the handle entry */ /* Reference the handle entry */
pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); pentry = ENTRY_ReferenceEntryByHandle(hobj, 0);
if (!pentry) if (!pentry)
@ -735,6 +755,9 @@ GDIOBJ_LockObject(
return NULL; return NULL;
} }
/* Make sure lock order is correct */
ASSERT_LOCK_ORDER(objt);
/* Reference the handle entry */ /* Reference the handle entry */
pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); pentry = ENTRY_ReferenceEntryByHandle(hobj, 0);
if (!pentry) if (!pentry)