[NTOSKRNL:KE] Implemented Slim Futex
Implemented Exceptionally Fast, yet simple Mutex ,exclusive to Alcyone called Slim Futex. Functions implemented *KeInitializeSlimFutex *KeAcquireSlimFutex *KeReleaseSlimFutex *KeIsSlimFutexHeld *KeIsSlimFutexLocked
This commit is contained in:
parent
d5aaba3c2d
commit
52f5bb6bd2
145
NTOSKRNL/KE/slimfutex.cpp
Normal file
145
NTOSKRNL/KE/slimfutex.cpp
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* PROJECT: Alcyone System Kernel
|
||||||
|
* LICENSE: BSD Clause 3
|
||||||
|
* PURPOSE: Slim Futex
|
||||||
|
* NT KERNEL: 5.11.9360
|
||||||
|
* COPYRIGHT: 2023-2029 Dibymartanda Samanta <>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ntoskrnl.h>
|
||||||
|
#define NTDEBUG
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
|
||||||
|
typedef struct _KE_SLIM_FUTEX {
|
||||||
|
volatile LONG Value;
|
||||||
|
} KE_SLIM_FUTEX, *PKE_SLIM_FUTEX;
|
||||||
|
|
||||||
|
/* IS_HELD_BIT: Indicates if the futex is currently held.
|
||||||
|
HAS_PARKED_BIT : Indicates if there are any parked (waiting) threads. */
|
||||||
|
constexpr ULONG IS_HELD_BIT = 1;
|
||||||
|
constexpr ULONG HAS_PARKED_BIT = 2;
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
KeAcquireSlimFutexSlow(
|
||||||
|
_Inout_ PKE_SLIM_FUTEX Futex
|
||||||
|
)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
LARGE_INTEGER Timeout;
|
||||||
|
Timeout.QuadPart = -50000; // 5ms
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
LONG CurrentValue = Futex->Value;
|
||||||
|
if (!(CurrentValue & IS_HELD_BIT)) {
|
||||||
|
if (InterlockedCompareExchange(&Futex->Value, CurrentValue | IS_HELD_BIT, CurrentValue) == CurrentValue) {
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(CurrentValue & HAS_PARKED_BIT)) {
|
||||||
|
if (InterlockedCompareExchange(&Futex->Value, CurrentValue | HAS_PARKED_BIT, CurrentValue) != CurrentValue) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = KeWaitForSingleObject(Futex, Executive, KernelMode, FALSE, &Timeout);
|
||||||
|
if (!NT_SUCCESS(Status) && Status != STATUS_TIMEOUT) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
KeReleaseSlimFutexSlow(
|
||||||
|
_Inout_ PKE_SLIM_FUTEX Futex
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LONG OldValue;
|
||||||
|
do {
|
||||||
|
OldValue = Futex->Value;
|
||||||
|
LONG NewValue = OldValue & ~IS_HELD_BIT;
|
||||||
|
if (OldValue & HAS_PARKED_BIT)
|
||||||
|
NewValue &= ~HAS_PARKED_BIT;
|
||||||
|
if (InterlockedCompareExchange(&Futex->Value, NewValue, OldValue) == OldValue) {
|
||||||
|
if (OldValue & HAS_PARKED_BIT) {
|
||||||
|
KeSetEvent((PRKEVENT)Futex, IO_NO_INCREMENT, FALSE);
|
||||||
|
}
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
} while (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Exported Function*/
|
||||||
|
|
||||||
|
/* Initializes PKE_SLIM_FUTEX Pointer*/
|
||||||
|
NTSTATUS
|
||||||
|
KeInitializeSlimFutex(
|
||||||
|
_Out_ PKE_SLIM_FUTEX Futex
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Futex->Value = 0;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Attempts to acquire the slim futex, return STATUS_SUCCESS if succeeds */
|
||||||
|
NTSTATUS
|
||||||
|
KeAcquireSlimFutex(
|
||||||
|
_Inout_ PKE_SLIM_FUTEX Futex
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (InterlockedCompareExchange(&Futex->Value, IS_HELD_BIT, 0) == 0) {
|
||||||
|
// Futex acquired!
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return KeAcquireSlimFutexSlow(Futex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*TRUE if the futex is successfully acquired, FALSE otherwise*/
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
KeTryAcquireSlimFutex(
|
||||||
|
_Inout_ PKE_SLIM_FUTEX Futex
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (;;) {
|
||||||
|
LONG CurrentValue = Futex->Value;
|
||||||
|
if (CurrentValue & IS_HELD_BIT)
|
||||||
|
return FALSE;
|
||||||
|
if (InterlockedCompareExchange(&Futex->Value, CurrentValue | IS_HELD_BIT, CurrentValue) == CurrentValue)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Releases the slim futex*/
|
||||||
|
NTSTATUS
|
||||||
|
KeReleaseSlimFutex(
|
||||||
|
_Inout_ PKE_SLIM_FUTEX Futex
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (InterlockedCompareExchange(&Futex->Value, 0, IS_HELD_BIT) == IS_HELD_BIT) {
|
||||||
|
// Futex released and nobody was waiting!
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return KeReleaseSlimFutexSlow(Futex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return TRUE if provided Slim Futex is held , else false */
|
||||||
|
BOOLEAN
|
||||||
|
KeIsSlimFutexHeld(
|
||||||
|
_In_ PKE_SLIM_FUTEX Futex
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return (Futex->Value & IS_HELD_BIT) != 0;
|
||||||
|
}
|
||||||
|
/* Return true if Futex Locked, else return False */
|
||||||
|
BOOLEAN
|
||||||
|
KeIsSlimFutexLocked(
|
||||||
|
_In_ PKE_SLIM_FUTEX Futex
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return KeIsSlimFutexHeld(Futex);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user