- Inline GDIOBJ_UnlockObjByPtr, ASSERT that we don't unlock an already unlocked object, return how many locks are left.

- Don't access the objects cExclsiveLock field after unlocking it, instead use new return value of GDIOBJ_UnlockObjByPtr

svn path=/trunk/; revision=40069
This commit is contained in:
Timo Kreuzer 2009-03-17 01:06:34 +00:00
parent 8d1df272ce
commit 886b7b2ab2
3 changed files with 19 additions and 18 deletions

View file

@ -128,6 +128,7 @@ EngUnlockDriverObj(
IN HDRVOBJ hdo)
{
PEDRIVEROBJ pedo;
ULONG cLocks;
/* First lock to get a pointer to the object */
pedo = DRIVEROBJ_LockObject(hdo);
@ -138,10 +139,10 @@ EngUnlockDriverObj(
}
/* Unlock object */
DRIVEROBJ_UnlockObject(pedo);
cLocks = DRIVEROBJ_UnlockObject(pedo);
/* Check if we still hold a lock */
if (pedo->baseobj.cExclusiveLock < 1)
if (cLocks < 1)
{
/* Object wasn't locked before, fail. */
return FALSE;

View file

@ -61,7 +61,6 @@ BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle);
BOOL INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner);
BOOL INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
BOOL INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj);
VOID INTERNAL_CALL GDIOBJ_UnlockObjByPtr(POBJ Object);
VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
BOOL INTERNAL_CALL GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType);
POBJ INTERNAL_CALL GDIOBJ_AllocObj(UCHAR ObjectType);
@ -84,4 +83,20 @@ BOOL FASTCALL NtGdiDeleteObject(HGDIOBJ hObject);
BOOL FASTCALL IsObjectDead(HGDIOBJ);
BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
/*!
* Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked.
* You should unlock the object
* as soon as you don't need to have access to it's data.
* \param Object Object pointer (as returned by GDIOBJ_LockObj).
*/
ULONG
FORCEINLINE
GDIOBJ_UnlockObjByPtr(POBJ Object)
{
INT cLocks = InterlockedDecrement((PLONG)&Object->cExclusiveLock);
ASSERT(cLocks >= 0);
return cLocks;
}
#endif

View file

@ -1014,21 +1014,6 @@ GDIOBJ_ShareLockObj(HGDIOBJ hObj, DWORD ExpectedType)
}
/*!
* Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked. You should unlock the object
* as soon as you don't need to have access to it's data.
* \param Object Object pointer (as returned by GDIOBJ_LockObj).
*/
VOID INTERNAL_CALL
GDIOBJ_UnlockObjByPtr(POBJ Object)
{
if (InterlockedDecrement((PLONG)&Object->cExclusiveLock) < 0)
{
DPRINT1("Trying to unlock non-existant object\n");
}
}
VOID INTERNAL_CALL
GDIOBJ_ShareUnlockObjByPtr(POBJ Object)
{