[*] Updated AuTheading::WaitFor prototype
[+/*] Missing YieldPoll MS prototype in public header
This commit is contained in:
parent
30b0fce882
commit
a5a9fa3887
@ -11,7 +11,8 @@ namespace Aurora::Threading
|
|||||||
{
|
{
|
||||||
using PollCallback_cb = AuFunction<bool()>;
|
using PollCallback_cb = AuFunction<bool()>;
|
||||||
|
|
||||||
AUKN_SYM bool YieldPollNs(bool bPermitMultipleContextSwitches, AuUInt64 qwAbsTimeoutNs, PollCallback_cb cb);
|
AUKN_SYM bool YieldPollNs(bool bPermitMultipleContextSwitches, AuUInt64 qwAbsTimeoutNs, const PollCallback_cb &cb);
|
||||||
|
AUKN_SYM bool YieldPoll(bool bPermitMultipleContextSwitches, AuUInt64 qwTimeoutMs, const PollCallback_cb &cb);
|
||||||
|
|
||||||
AUKN_SYM bool WaitForAbsNS(IWaitable *pWaitable, AuUInt64 qwAbsTimeout = 0);
|
AUKN_SYM bool WaitForAbsNS(IWaitable *pWaitable, AuUInt64 qwAbsTimeout = 0);
|
||||||
AUKN_SYM bool TryWait(IWaitable *pWaitable);
|
AUKN_SYM bool TryWait(IWaitable *pWaitable);
|
||||||
@ -25,10 +26,12 @@ namespace Aurora::Threading
|
|||||||
* See: Mutex, CriticalSection, Semaphore, Event, Thread, Async, and others
|
* See: Mutex, CriticalSection, Semaphore, Event, Thread, Async, and others
|
||||||
* On timeout, returns false
|
* On timeout, returns false
|
||||||
* On error, waitables are restored to their state at the point of WaitFors
|
* On error, waitables are restored to their state at the point of WaitFors
|
||||||
|
* @warning: With kWaitForFlagTimeoutIsOr, we may have to long-poll with bad scheduling characteristics. Defer to AuAsync for thread local multiple wait scheduling, and AuIO for multiple io wait.
|
||||||
|
* Are you looking for AuIO::Loop::WaitMultipleLoopSources?
|
||||||
*/
|
*/
|
||||||
AUKN_SYM bool WaitFor(const AuList<IWaitable *> &waitables, AuUInt32 uFlags, AuUInt64 uTimeout = 0);
|
AUKN_SYM bool WaitFor(const AuList<IWaitable *> &waitables, AuUInt32 uFlags, AuUInt64 uTimeout = 0, AuUInt32 *pIndexAwoken = nullptr);
|
||||||
|
|
||||||
static inline bool WaitForShared(const AuList<AuSPtr<IWaitable>> &pWaitables, AuUInt32 uFlags, AuUInt64 uTimeout)
|
static inline bool WaitForShared(const AuList<AuSPtr<IWaitable>> &pWaitables, AuUInt32 uFlags, AuUInt64 uTimeout = 0, AuUInt32 *pIndexAwoken = nullptr)
|
||||||
{
|
{
|
||||||
AU_DEBUG_MEMCRUNCH;
|
AU_DEBUG_MEMCRUNCH;
|
||||||
AuList<IWaitable *> waitables;
|
AuList<IWaitable *> waitables;
|
||||||
@ -39,14 +42,14 @@ namespace Aurora::Threading
|
|||||||
waitables.push_back(pIWaitable.get());
|
waitables.push_back(pIWaitable.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
return WaitFor(waitables, uFlags, uTimeout);
|
return WaitFor(waitables, uFlags, uTimeout, pIndexAwoken);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// legacy api (~3 years old, relative to 2023)
|
/// legacy api (~3 years old, relative to 2023)
|
||||||
/// @deprecated
|
/// @deprecated
|
||||||
static inline bool WaitFor(const AuList<IWaitable *> &waitables, AuUInt64 uTimeout)
|
static inline bool WaitFor(const AuList<IWaitable *> &waitables, AuUInt64 uTimeout)
|
||||||
{
|
{
|
||||||
return WaitFor(waitables, 0, uTimeout);
|
return WaitFor(waitables, 0, uTimeout, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// legacy api (~3 years old, relative to 2023)
|
/// legacy api (~3 years old, relative to 2023)
|
||||||
|
@ -51,7 +51,7 @@ namespace Aurora::Threading
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
AUKN_SYM bool YieldPollNs(bool bPermitMultipleContextSwitches, AuUInt64 qwAbsTimeoutNs, PollCallback_cb cb)
|
AUKN_SYM bool YieldPollNs(bool bPermitMultipleContextSwitches, AuUInt64 qwAbsTimeoutNs, const PollCallback_cb &cb)
|
||||||
{
|
{
|
||||||
while (!Primitives::DoTryIf(cb))
|
while (!Primitives::DoTryIf(cb))
|
||||||
{
|
{
|
||||||
@ -69,15 +69,17 @@ namespace Aurora::Threading
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
AUKN_SYM bool YieldPoll(bool permitMultipleContextSwitches, AuUInt64 qwTimeoutMs, PollCallback_cb cb)
|
AUKN_SYM bool YieldPoll(bool bPermitMultipleContextSwitches, AuUInt64 qwTimeoutMs, const PollCallback_cb &cb)
|
||||||
{
|
{
|
||||||
return YieldPollNs(permitMultipleContextSwitches,
|
return YieldPollNs(bPermitMultipleContextSwitches,
|
||||||
qwTimeoutMs ? Time::SteadyClockNS() + AuMSToNS<AuUInt64>(qwTimeoutMs) : 0,
|
qwTimeoutMs ? Time::SteadyClockNS() + AuMSToNS<AuUInt64>(qwTimeoutMs) : 0,
|
||||||
cb);
|
cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
AUKN_SYM bool WaitForAbsNS(IWaitable *pWaitable, AuUInt64 qwAbsTimeout)
|
AUKN_SYM bool WaitForAbsNS(IWaitable *pWaitable, AuUInt64 qwAbsTimeout)
|
||||||
{
|
{
|
||||||
|
SysCheckArgNotNull(pWaitable, false);
|
||||||
|
|
||||||
if (pWaitable->HasLockImplementation())
|
if (pWaitable->HasLockImplementation())
|
||||||
{
|
{
|
||||||
return pWaitable->LockAbsNS(qwAbsTimeout);
|
return pWaitable->LockAbsNS(qwAbsTimeout);
|
||||||
@ -91,6 +93,8 @@ namespace Aurora::Threading
|
|||||||
|
|
||||||
AUKN_SYM bool TryWait(IWaitable *pWaitable)
|
AUKN_SYM bool TryWait(IWaitable *pWaitable)
|
||||||
{
|
{
|
||||||
|
SysCheckArgNotNull(pWaitable, false);
|
||||||
|
|
||||||
if (pWaitable->HasLockImplementation())
|
if (pWaitable->HasLockImplementation())
|
||||||
{
|
{
|
||||||
return pWaitable->TryLock();
|
return pWaitable->TryLock();
|
||||||
@ -102,7 +106,7 @@ namespace Aurora::Threading
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
AUKN_SYM bool WaitFor(const AuList<IWaitable *> &waitables, AuUInt32 uFlags, AuUInt64 uTimeout)
|
AUKN_SYM bool WaitFor(const AuList<IWaitable *> &waitables, AuUInt32 uFlags, AuUInt64 uTimeout, AuUInt32 *pIndexAwoken)
|
||||||
{
|
{
|
||||||
AU_DEBUG_MEMCRUNCH;
|
AU_DEBUG_MEMCRUNCH;
|
||||||
|
|
||||||
@ -146,6 +150,10 @@ namespace Aurora::Threading
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
bLocked = waitables[i]->TryLock();
|
bLocked = waitables[i]->TryLock();
|
||||||
|
if (pIndexAwoken)
|
||||||
|
{
|
||||||
|
*pIndexAwoken = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bLocked)
|
if (bLocked)
|
||||||
|
Loading…
Reference in New Issue
Block a user