[*] WaitMultipleLoopSources optimizations cont

This commit is contained in:
Reece Wilson 2023-12-01 12:24:18 +00:00
parent 3f7f2639c4
commit eceb037e70
2 changed files with 50 additions and 23 deletions

View File

@ -12,7 +12,7 @@
namespace Aurora::IO::Loop
{
AuList<AuSPtr<ILoopSource>> WaitMultipleOrObjects(const AuList<AuSPtr<ILoopSource>> &objects, AuUInt32 timeout)
AuList<AuSPtr<ILoopSource>> WaitMultipleOrObjects(const AuList<AuSPtr<ILoopSource>> &objects, bool bZeroTick, AuUInt32 dwTimeoutReq)
{
bool isWinLoop;
AuList<AuSPtr<ILoopSourceEx>> loopSourceExs;
@ -68,15 +68,23 @@ namespace Aurora::IO::Loop
source->OnPresleep();
}
AuUInt32 uTimeout {};
if (!bZeroTick)
{
uTimeout = dwTimeoutReq ?
dwTimeoutReq :
INFINITE;
}
DWORD ret;
if (isWinLoop &&
pMsgWaitForMultipleObjectsEx)
{
ret = pMsgWaitForMultipleObjectsEx(handleArray.size(), handleArray.data(), timeout ? timeout : INFINITE, QS_ALLPOSTMESSAGE | QS_ALLINPUT, MWMO_INPUTAVAILABLE | MWMO_ALERTABLE);
ret = pMsgWaitForMultipleObjectsEx(handleArray.size(), handleArray.data(), uTimeout, QS_ALLPOSTMESSAGE | QS_ALLINPUT, MWMO_INPUTAVAILABLE | MWMO_ALERTABLE);
}
else
{
ret = ::WaitForMultipleObjectsEx(handleArray.size(), handleArray.data(), false, timeout ? timeout : INFINITE, true);
ret = ::WaitForMultipleObjectsEx(handleArray.size(), handleArray.data(), false, uTimeout, true);
}
bool error = ((ret == WAIT_TIMEOUT) ||

View File

@ -53,9 +53,9 @@ namespace Aurora::IO::Loop
}
#if defined(AURORA_IS_MODERNNT_DERIVED)
AuList<AuSPtr<ILoopSource>> WaitMultipleOrObjects(const AuList<AuSPtr<ILoopSource>> &objects, AuUInt32 timeout);
AuList<AuSPtr<ILoopSource>> WaitMultipleOrObjects(const AuList<AuSPtr<ILoopSource>> &objects, bool bZeroTick, AuUInt32 timeout);
#endif
AuList<AuSPtr<ILoopSource>> WaitMultipleOrObjectsFallback(const AuList<AuSPtr<ILoopSource>> &objects, AuUInt32 timeout, bool &bTimeout);
AuList<AuSPtr<ILoopSource>> WaitMultipleOrObjectsFallback(const AuList<AuSPtr<ILoopSource>> &objects, AuUInt32 timeout, bool bZeroTick, bool &bTimeout);
void ResetLoopSourceFalseAlarm(const AuSPtr<Loop::ILoopSource> &pLoopSource)
{
@ -219,10 +219,11 @@ namespace Aurora::IO::Loop
)
{
auto pSource = *itr;
auto eType = pSource->GetType();
if (pSource->GetType() == ELoopSource::eSourceMutex ||
pSource->GetType() == ELoopSource::eSourceSemaphore ||
pSource->GetType() == ELoopSource::eSourceEvent)
if (eType == ELoopSource::eSourceMutex ||
eType == ELoopSource::eSourceSemaphore ||
eType == ELoopSource::eSourceEvent)
{
auto pSourceEx = AuDynamicCast<Loop::ILoopSourceEx>(pSource);
@ -263,17 +264,20 @@ namespace Aurora::IO::Loop
if (lsList2.size())
{
if (signalTemp.size())
bool bZeroTick { };
if ((bZeroTick = bool(signalTemp.size())))
{
uTimeoutMS = 1;
}
#if defined(AURORA_IS_MODERNNT_DERIVED)
signaled = WaitMultipleOrObjects(lsList2, uTimeoutMS);
bTimedout = uTimeoutMS ?
signaled = WaitMultipleOrObjects(lsList2, bZeroTick, uTimeoutMS);
bTimedout = uTimeoutMS && !bZeroTick ?
Time::SteadyClockNS() >= uTimeoutEnd :
false;
#else
signaled = WaitMultipleOrObjectsFallback(lsList2, uTimeoutMS, bTimedout);
signaled = WaitMultipleOrObjectsFallback(lsList2, uTimeoutMS, bZeroTick, bTimedout);
bTimedout &= !bZeroTick;
#endif
}
@ -290,7 +294,7 @@ namespace Aurora::IO::Loop
}
}
AuList<AuSPtr<ILoopSource>> WaitMultipleOrObjectsFallback(const AuList<AuSPtr<ILoopSource>> &objects, AuUInt32 timeout, bool &bTimeout)
AuList<AuSPtr<ILoopSource>> WaitMultipleOrObjectsFallback(const AuList<AuSPtr<ILoopSource>> &objects, AuUInt32 timeout, bool bZeroTick, bool &bTimeout)
{
AuList<AuSPtr<ILoopSourceEx>> loopSourceExs;
AuList<AuSPtr<ILoopSource>> triggered;
@ -330,9 +334,9 @@ namespace Aurora::IO::Loop
continue;
}
if (auto extended = AuDynamicCast<ILoopSourceEx>(source))
if (auto pLoopSourceEx = AuDynamicCast<ILoopSourceEx>(source))
{
if (!AuTryInsert(loopSourceExs, extended))
if (!AuTryInsert(loopSourceExs, pLoopSourceEx))
{
return {};
}
@ -361,21 +365,36 @@ namespace Aurora::IO::Loop
source->OnPresleep();
}
bTimeout = !pQueue->WaitAny(timeout);
for (AU_ITERATE_N(i, objects.size()))
if (bZeroTick)
{
auto source = loopSourceExs[i];
(void)pQueue->PumpNonblocking();
}
else
{
bTimeout = !pQueue->WaitAny(timeout);
}
for (AU_ITERATE_N(i, loopSourceExs.size()))
{
auto pLoopSource = loopSourceExs[i];
if (std::find(triggered.begin(), triggered.end(), source) == triggered.end())
if (std::find(triggered.begin(), triggered.end(), pLoopSource) == triggered.end())
{
if (source->IsSignaled())
auto eType = pLoopSource->GetType();
if (!bTimeout ||
eType == ELoopSource::eSourceMutex ||
eType == ELoopSource::eSourceSemaphore ||
eType == ELoopSource::eSourceEvent)
{
triggered.push_back(source);
if (pLoopSource->IsSignaledNoSpinIfUserland())
{
triggered.push_back(pLoopSource);
}
}
}
source->OnFinishSleep();
pLoopSource->OnFinishSleep();
}
return triggered;