Implement conversion of shared push lock to exclusive mode
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 31s
Builds / ExectOS (i686, release) (push) Successful in 30s
Builds / ExectOS (amd64, debug) (push) Successful in 52s
Builds / ExectOS (i686, debug) (push) Successful in 49s

This commit is contained in:
2026-07-01 16:29:30 +02:00
parent c58305022f
commit 5cd52a4a12
2 changed files with 26 additions and 0 deletions

View File

@@ -22,6 +22,7 @@ namespace KE
STATIC XTFASTCALL VOID AcquireSharedPushLock(PKPUSH_LOCK PushLock);
STATIC XTFASTCALL VOID AcquireWaitExclusivePushLock(IN 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 ReleaseExclusivePushLock(IN PKPUSH_LOCK PushLock);
STATIC XTFASTCALL VOID ReleasePushLock(IN PKPUSH_LOCK PushLock);

View File

@@ -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.
*