simplification of irql manipulation in a couple of places - patch by Mike Nordell

svn path=/trunk/; revision=6333
This commit is contained in:
Vizzini 2003-10-16 03:26:51 +00:00
parent 46fe6c1b84
commit 9ce7e4fa9d

View file

@ -19,7 +19,7 @@
/* /*
* GDIOBJ.C - GDI object manipulation routines * GDIOBJ.C - GDI object manipulation routines
* *
* $Id: gdiobj.c,v 1.46 2003/10/15 03:09:23 vizzini Exp $ * $Id: gdiobj.c,v 1.47 2003/10/16 03:26:51 vizzini Exp $
* *
*/ */
@ -149,20 +149,15 @@ static FAST_MUTEX RefCountHandling;
/*! /*!
* Allocate GDI object table. * Allocate GDI object table.
* \param Size - number of entries in the object table. * \param Size - number of entries in the object table.
* Notes:: Must be called at IRQL < DISPATCH_LEVEL.
*/ */
static PGDI_HANDLE_TABLE FASTCALL static PGDI_HANDLE_TABLE FASTCALL
GDIOBJ_iAllocHandleTable (WORD Size) GDIOBJ_iAllocHandleTable (WORD Size)
{ {
PGDI_HANDLE_TABLE handleTable; PGDI_HANDLE_TABLE handleTable;
KIRQL OldIrql;
BOOLEAN IrqlRaised = FALSE;
if(KeGetCurrentIrql() < APC_LEVEL)
{
KeRaiseIrql(APC_LEVEL, &OldIrql);
IrqlRaised = TRUE;
}
/* prevent APC delivery for the *FastMutexUnsafe calls */
const KIRQL PrevIrql = KfRaiseIrql(APC_LEVEL);
ExAcquireFastMutexUnsafe (&HandleTableMutex); ExAcquireFastMutexUnsafe (&HandleTableMutex);
handleTable = ExAllocatePool(PagedPool, handleTable = ExAllocatePool(PagedPool,
sizeof(GDI_HANDLE_TABLE) + sizeof(GDI_HANDLE_TABLE) +
@ -173,9 +168,7 @@ GDIOBJ_iAllocHandleTable (WORD Size)
sizeof(GDI_HANDLE_TABLE) + sizeof(PGDIOBJ) * Size); sizeof(GDI_HANDLE_TABLE) + sizeof(PGDIOBJ) * Size);
handleTable->wTableSize = Size; handleTable->wTableSize = Size;
ExReleaseFastMutexUnsafe (&HandleTableMutex); ExReleaseFastMutexUnsafe (&HandleTableMutex);
KfLowerIrql(PrevIrql);
if(IrqlRaised)
KeLowerIrql(OldIrql);
return handleTable; return handleTable;
} }
@ -203,15 +196,9 @@ static WORD FASTCALL
GDIOBJ_iGetNextOpenHandleIndex (void) GDIOBJ_iGetNextOpenHandleIndex (void)
{ {
WORD tableIndex; WORD tableIndex;
BOOLEAN IrqlRaised = FALSE;
KIRQL OldIrql;
if(KeGetCurrentIrql() < APC_LEVEL)
{
KeRaiseIrql(APC_LEVEL, &OldIrql);
IrqlRaised = TRUE;
}
/* prevent APC delivery for the *FastMutexUnsafe calls */
const KIRQL PrevIrql = KfRaiseIrql(APC_LEVEL);
ExAcquireFastMutexUnsafe (&HandleTableMutex); ExAcquireFastMutexUnsafe (&HandleTableMutex);
for (tableIndex = 1; tableIndex < HandleTable->wTableSize; tableIndex++) for (tableIndex = 1; tableIndex < HandleTable->wTableSize; tableIndex++)
{ {
@ -222,9 +209,7 @@ GDIOBJ_iGetNextOpenHandleIndex (void)
} }
} }
ExReleaseFastMutexUnsafe (&HandleTableMutex); ExReleaseFastMutexUnsafe (&HandleTableMutex);
KfLowerIrql(PrevIrql);
if(IrqlRaised)
KeLowerIrql(OldIrql);
return (tableIndex < HandleTable->wTableSize) ? tableIndex : 0; return (tableIndex < HandleTable->wTableSize) ? tableIndex : 0;
} }