mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
- 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:
parent
8d1df272ce
commit
886b7b2ab2
3 changed files with 19 additions and 18 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue