[*] ...and same applies to RWLock
(instead its pls dont use the public api instead of the internal NT apis)
This commit is contained in:
parent
9601fcfd39
commit
109b0cff3f
@ -11,7 +11,7 @@
|
||||
namespace Aurora::Threading
|
||||
{
|
||||
// Buttered up native high-res wait for change API:
|
||||
bool InternalLTSWaitOnAddressHighRes(void *pTargetAddress,
|
||||
bool InternalLTSWaitOnAddressHighRes(const void *pTargetAddress,
|
||||
const void *pCompareAddress,
|
||||
AuUInt8 uWordSize,
|
||||
AuUInt64 qwNanosecondsAbs);
|
||||
@ -22,14 +22,17 @@ namespace Aurora::Threading
|
||||
// ...cont
|
||||
void InternalLTSWakeOne(const void *pTargetAddress);
|
||||
|
||||
// ...cont
|
||||
void InternalLTSWakeCount(const void *pTargetAddress, AuUInt32 uCount);
|
||||
|
||||
// extra wrapping for use with primitives when expecting less scheduler indirection
|
||||
// (its good to avoid the emulation layer in the slow paths of high level primitives)
|
||||
|
||||
static bool InternalLTSWaitOnAddressHighRes(volatile void *pTargetAddress,
|
||||
static bool InternalLTSWaitOnAddressHighRes(volatile const void *pTargetAddress,
|
||||
const void *pCompareAddress,
|
||||
AuUInt8 uWordSize,
|
||||
AuUInt64 qwNanosecondsAbs)
|
||||
{
|
||||
return InternalLTSWaitOnAddressHighRes((void *)pTargetAddress, pCompareAddress, uWordSize, qwNanosecondsAbs);
|
||||
return InternalLTSWaitOnAddressHighRes((const void *)pTargetAddress, pCompareAddress, uWordSize, qwNanosecondsAbs);
|
||||
}
|
||||
}
|
@ -768,7 +768,7 @@ namespace Aurora::Threading
|
||||
// it does work on Linux and Windows 8+
|
||||
// it does not, however, work on emulated platforms
|
||||
// this is intentional
|
||||
bool InternalLTSWaitOnAddressHighRes(void *pTargetAddress,
|
||||
bool InternalLTSWaitOnAddressHighRes(const void *pTargetAddress,
|
||||
const void *pCompareAddress,
|
||||
AuUInt8 uWordSize,
|
||||
AuUInt64 qwNanosecondsAbs)
|
||||
@ -807,6 +807,12 @@ namespace Aurora::Threading
|
||||
RunOSWakeNOnAddress(pWakeAddress, uDelta ? INT_MAX : 1);
|
||||
}
|
||||
|
||||
void InternalLTSWakeCount(const void *pTargetAddress, AuUInt32 uCount)
|
||||
{
|
||||
auto [pWakeAddress, uDelta, uMask] = DecodeAddress(pTargetAddress, 1);
|
||||
RunOSWakeNOnAddress(pWakeAddress, uDelta ? INT_MAX : uCount);
|
||||
}
|
||||
|
||||
AUKN_SYM bool WaitOnAddress(const void *pTargetAddress,
|
||||
const void *pCompareAddress,
|
||||
AuUInt8 uWordSize,
|
||||
|
@ -9,6 +9,7 @@
|
||||
//#define RWLOCK_VIEW_HAS_PARENT
|
||||
#include "AuRWLock.hpp"
|
||||
#include "SMTYield.hpp"
|
||||
#include "../AuWakeInternal.hpp"
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
@ -166,7 +167,7 @@ namespace Aurora::Threading::Primitives
|
||||
{
|
||||
if (gUseFutexRWLock)
|
||||
{
|
||||
if (!WaitOnAddressSteady((const void *)&this->state_, &iCurState, sizeof(iCurState), uTimeout))
|
||||
if (!InternalLTSWaitOnAddressHighRes((const void *)&this->state_, &iCurState, sizeof(iCurState), uTimeout))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -232,7 +233,7 @@ namespace Aurora::Threading::Primitives
|
||||
{
|
||||
if (gUseFutexRWLock)
|
||||
{
|
||||
if (!WaitOnAddressSteady((const void *)&this->state_, &iCurState, sizeof(iCurState), uEndTime))
|
||||
if (!InternalLTSWaitOnAddressHighRes((const void *)&this->state_, &iCurState, sizeof(iCurState), uEndTime))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -424,7 +425,7 @@ namespace Aurora::Threading::Primitives
|
||||
while ((iCurState = AuAtomicLoad(&this->state_)) != 0)
|
||||
{
|
||||
static const AuUInt32 kExpect { 0 };
|
||||
if (!WaitOnAddressSteady(pSemaphore, &kExpect, sizeof(kExpect), qwTimeoutNS))
|
||||
if (!InternalLTSWaitOnAddressHighRes(pSemaphore, &kExpect, sizeof(kExpect), qwTimeoutNS))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@ -503,7 +504,7 @@ namespace Aurora::Threading::Primitives
|
||||
{
|
||||
if (gUseFutexRWLock)
|
||||
{
|
||||
WakeOnAddress((const void *)&this->state_);
|
||||
InternalLTSWakeOne((const void *)&this->state_);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -518,7 +519,7 @@ namespace Aurora::Threading::Primitives
|
||||
{
|
||||
auto pThat = this->GetFutexConditionWriter();
|
||||
AuAtomicAdd(pThat, 1u);
|
||||
WakeOnAddress(pThat);
|
||||
InternalLTSWakeOne(pThat);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -531,7 +532,7 @@ namespace Aurora::Threading::Primitives
|
||||
{
|
||||
if (gUseFutexRWLock)
|
||||
{
|
||||
WakeAllOnAddress((const void *)&this->state_);
|
||||
InternalLTSWakeAll((const void *)&this->state_);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -547,7 +548,7 @@ namespace Aurora::Threading::Primitives
|
||||
auto pThat = this->GetFutexConditionWriter();
|
||||
AuUInt32 uCount = AuAtomicLoad(&this->writersPending_);
|
||||
AuAtomicAdd(pThat, uCount);
|
||||
WakeNOnAddress(pThat, uCount);
|
||||
InternalLTSWakeCount(pThat, uCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -843,7 +844,7 @@ namespace Aurora::Threading::Primitives
|
||||
}
|
||||
else
|
||||
{
|
||||
bStatus = WaitOnAddressSteady(pSemaphore, &kExpect, sizeof(kExpect), uEndTime);
|
||||
bStatus = InternalLTSWaitOnAddressHighRes(pSemaphore, &kExpect, sizeof(kExpect), uEndTime);
|
||||
}
|
||||
AuAtomicSub(&this->writersPending_, 1);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user