[+] Future proof IWaitable with Abs waits
(polyfil for now)
This commit is contained in:
parent
301f1a6025
commit
07ce6d8974
@ -7,23 +7,58 @@
|
|||||||
***/
|
***/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
namespace Aurora::Time
|
||||||
|
{
|
||||||
|
AUKN_SYM AuUInt64 SteadyClockNS();
|
||||||
|
}
|
||||||
|
|
||||||
namespace Aurora::Threading
|
namespace Aurora::Threading
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
IWaitable represents a generic waitable primitive <br>
|
IWaitable represents a generic waitable primitive <br>
|
||||||
There is no guarantee of any specific underlying primitive or backing by the operating system directly <br>
|
There is no guarantee of any specific underlying primitive or backing by the operating system directly <br>
|
||||||
*All* methods **must** be supported on all platforms. If they don't, think harder! <br>
|
*All* methods **must** be supported on all platforms. <br>
|
||||||
Implementable on: NX, Win32 via CVs, and others via pthreads <br>
|
|
||||||
Zero timeout = infinity <br>
|
|
||||||
*/
|
*/
|
||||||
struct IWaitable
|
struct AUKN_SYM IWaitable
|
||||||
{
|
{
|
||||||
|
// Mostly worthless. Do not access
|
||||||
|
// Used by internals
|
||||||
virtual bool HasOSHandle(AuMach &mach) = 0;
|
virtual bool HasOSHandle(AuMach &mach) = 0;
|
||||||
|
|
||||||
|
// Do not access
|
||||||
|
// Used by internals
|
||||||
virtual bool HasLockImplementation() = 0;
|
virtual bool HasLockImplementation() = 0;
|
||||||
|
|
||||||
virtual void Lock() = 0;
|
virtual void Lock() = 0;
|
||||||
virtual bool LockMS(AuUInt64 timeout /*=0*/) = 0;
|
|
||||||
virtual bool LockNS(AuUInt64 timeout /*=0*/) = 0;
|
inline virtual bool LockMS(AuUInt64 qwRelTimeoutInMs /* = 0, infinity - use TryLock for an opportunistic lock-spin-once operation */)
|
||||||
|
{
|
||||||
|
return this->LockAbsNS(qwRelTimeoutInMs ? Aurora::Time::SteadyClockNS() + AuMSToNS<AuUInt64>(qwRelTimeoutInMs) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline virtual bool LockNS(AuUInt64 qwRelTimeoutInNs /* = 0, infinity - use TryLock for an opportunistic lock-spin-once operation */)
|
||||||
|
{
|
||||||
|
return this->LockAbsNS(qwRelTimeoutInNs ? Aurora::Time::SteadyClockNS() + qwRelTimeoutInNs : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline virtual bool LockAbsMS(AuUInt64 qwAbsTimeoutInMs /* = 0, infinity*/)
|
||||||
|
{
|
||||||
|
if (!qwAbsTimeoutInMs) return this->LockNS(0);
|
||||||
|
auto iTimeDelta = AuInt64(AuMSToNS<AuUInt64>(qwAbsTimeoutInMs)) - AuInt64(Aurora::Time::SteadyClockNS());
|
||||||
|
if (iTimeDelta <= 0) return TryLock();
|
||||||
|
return this->LockNS(iTimeDelta);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline virtual bool LockAbsNS(AuUInt64 qwAbsTimeoutInNs /* = 0, infinity*/)
|
||||||
|
{
|
||||||
|
if (!qwAbsTimeoutInNs) return this->LockNS(0);
|
||||||
|
auto iTimeDelta = AuInt64(qwAbsTimeoutInNs) - AuInt64(Aurora::Time::SteadyClockNS());
|
||||||
|
if (iTimeDelta <= 0) return TryLock();
|
||||||
|
return this->LockNS(iTimeDelta);
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool TryLock() = 0;
|
virtual bool TryLock() = 0;
|
||||||
|
|
||||||
virtual void Unlock() = 0;
|
virtual void Unlock() = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -33,9 +33,9 @@ namespace Aurora::Threading::Primitives
|
|||||||
static const auto kPrimitiveSizeRWLock = kPrimitiveSizeNTRWLock;
|
static const auto kPrimitiveSizeRWLock = kPrimitiveSizeNTRWLock;
|
||||||
static const auto kPrimitiveSizeCond = kPrimitiveSizeNTCond;
|
static const auto kPrimitiveSizeCond = kPrimitiveSizeNTCond;
|
||||||
static const auto kPrimitiveSizeCondMutex = kPrimitiveSizeNTCondMutex;
|
static const auto kPrimitiveSizeCondMutex = kPrimitiveSizeNTCondMutex;
|
||||||
|
|
||||||
// fuck you, its time to overtake the STL in even Windows 11 micro-benchmarks
|
// fuck you, its time to overtake the STL in even Windows 11 micro-benchmarks
|
||||||
#define AURT_ENABLE_HYPER_MUTEX
|
#define AURT_ENABLE_HYPER_MUTEX
|
||||||
|
|
||||||
//#elif defined(AURORA_IS_LINUX_DERIVED)
|
//#elif defined(AURORA_IS_LINUX_DERIVED)
|
||||||
//
|
//
|
||||||
@ -73,7 +73,7 @@ namespace Aurora::Threading::Primitives
|
|||||||
#if defined(AURT_ENABLE_HYPER_MUTEX)
|
#if defined(AURT_ENABLE_HYPER_MUTEX)
|
||||||
using IHyperWaitable = HyperWaitable;
|
using IHyperWaitable = HyperWaitable;
|
||||||
#else
|
#else
|
||||||
using IHyperWaitable = IWaitable;
|
using IHyperWaitable = IWaitable;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user