mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +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)
|
IN HDRVOBJ hdo)
|
||||||
{
|
{
|
||||||
PEDRIVEROBJ pedo;
|
PEDRIVEROBJ pedo;
|
||||||
|
ULONG cLocks;
|
||||||
|
|
||||||
/* First lock to get a pointer to the object */
|
/* First lock to get a pointer to the object */
|
||||||
pedo = DRIVEROBJ_LockObject(hdo);
|
pedo = DRIVEROBJ_LockObject(hdo);
|
||||||
|
@ -138,10 +139,10 @@ EngUnlockDriverObj(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unlock object */
|
/* Unlock object */
|
||||||
DRIVEROBJ_UnlockObject(pedo);
|
cLocks = DRIVEROBJ_UnlockObject(pedo);
|
||||||
|
|
||||||
/* Check if we still hold a lock */
|
/* Check if we still hold a lock */
|
||||||
if (pedo->baseobj.cExclusiveLock < 1)
|
if (cLocks < 1)
|
||||||
{
|
{
|
||||||
/* Object wasn't locked before, fail. */
|
/* Object wasn't locked before, fail. */
|
||||||
return FALSE;
|
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_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner);
|
||||||
BOOL INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
|
BOOL INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
|
||||||
BOOL INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj);
|
BOOL INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj);
|
||||||
VOID INTERNAL_CALL GDIOBJ_UnlockObjByPtr(POBJ Object);
|
|
||||||
VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
|
VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
|
||||||
BOOL INTERNAL_CALL GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType);
|
BOOL INTERNAL_CALL GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType);
|
||||||
POBJ INTERNAL_CALL GDIOBJ_AllocObj(UCHAR ObjectType);
|
POBJ INTERNAL_CALL GDIOBJ_AllocObj(UCHAR ObjectType);
|
||||||
|
@ -84,4 +83,20 @@ BOOL FASTCALL NtGdiDeleteObject(HGDIOBJ hObject);
|
||||||
BOOL FASTCALL IsObjectDead(HGDIOBJ);
|
BOOL FASTCALL IsObjectDead(HGDIOBJ);
|
||||||
BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
|
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
|
#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
|
VOID INTERNAL_CALL
|
||||||
GDIOBJ_ShareUnlockObjByPtr(POBJ Object)
|
GDIOBJ_ShareUnlockObjByPtr(POBJ Object)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue