Implement conversion of shared push lock to exclusive mode
This commit is contained in:
@@ -22,6 +22,7 @@ namespace KE
|
|||||||
STATIC XTFASTCALL VOID AcquireSharedPushLock(PKPUSH_LOCK PushLock);
|
STATIC XTFASTCALL VOID AcquireSharedPushLock(PKPUSH_LOCK PushLock);
|
||||||
STATIC XTFASTCALL VOID AcquireWaitExclusivePushLock(IN PKPUSH_LOCK PushLock);
|
STATIC XTFASTCALL VOID AcquireWaitExclusivePushLock(IN PKPUSH_LOCK PushLock);
|
||||||
STATIC XTFASTCALL VOID AcquireWaitSharedPushLock(IN OUT PKPUSH_LOCK PushLock);
|
STATIC XTFASTCALL VOID AcquireWaitSharedPushLock(IN OUT PKPUSH_LOCK PushLock);
|
||||||
|
STATIC XTFASTCALL BOOLEAN ConvertSharedPushLockToExclusive(IN PKPUSH_LOCK PushLock);
|
||||||
STATIC XTFASTCALL VOID InitializePushLock(IN PKPUSH_LOCK PushLock);
|
STATIC XTFASTCALL VOID InitializePushLock(IN PKPUSH_LOCK PushLock);
|
||||||
STATIC XTFASTCALL VOID ReleaseExclusivePushLock(IN PKPUSH_LOCK PushLock);
|
STATIC XTFASTCALL VOID ReleaseExclusivePushLock(IN PKPUSH_LOCK PushLock);
|
||||||
STATIC XTFASTCALL VOID ReleasePushLock(IN PKPUSH_LOCK PushLock);
|
STATIC XTFASTCALL VOID ReleasePushLock(IN PKPUSH_LOCK PushLock);
|
||||||
|
|||||||
@@ -299,6 +299,31 @@ KE::PushLock::AcquireWaitSharedPushLock(IN PKPUSH_LOCK PushLock)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to convert a push lock from shared to exclusive access.
|
||||||
|
*
|
||||||
|
* @param PushLock
|
||||||
|
* Supplies a pointer to the push lock structure.
|
||||||
|
*
|
||||||
|
* @return This routine returns TRUE if the lock was successfully converted to exclusive mode, or FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTFASTCALL
|
||||||
|
BOOLEAN
|
||||||
|
KE::PushLock::ConvertSharedPushLockToExclusive(IN PKPUSH_LOCK PushLock)
|
||||||
|
{
|
||||||
|
PVOID OldValue;
|
||||||
|
|
||||||
|
/* Swap the push lock state */
|
||||||
|
OldValue = RTL::Atomic::CompareExchangePointer(&PushLock->Ptr,
|
||||||
|
(PVOID)KPUSHLOCK_INCREMENT_SHARED,
|
||||||
|
(PVOID)KPUSHLOCK_LOCK);
|
||||||
|
|
||||||
|
/* Return conversion result */
|
||||||
|
return (OldValue == (PVOID)KPUSHLOCK_INCREMENT_SHARED);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes a push lock.
|
* Initializes a push lock.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user