[*] NT fix pre/finish sleep out of balance

[*] Fix some more wait alls
This commit is contained in:
Reece Wilson 2023-10-21 13:12:58 +01:00
parent 4d454287b8
commit 5233dc7ac8
3 changed files with 59 additions and 20 deletions

View File

@ -58,6 +58,6 @@ namespace Aurora::IO::Loop
AuUInt32 state_;
};
AuUInt32 uApproxSleepCount;
AuUInt32 uApproxSleepCount {};
};
}

View File

@ -26,6 +26,7 @@ static bool WaitStatusFromAligned(DWORD ret, bool active)
namespace Aurora::IO::Loop
{
void ResetLoopSourceFalseAlarm(const AuSPtr<Loop::ILoopSource> &pLoopSource);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Loop Queue :: Extended Handle
@ -612,6 +613,23 @@ namespace Aurora::IO::Loop
AU_LOCK_GUARD(this->rwMutex_->AsReadable());
for (const auto &source : this->loopSourceExs_)
{
source.source->OnPresleep();
}
auto bRet = WaitAllEx(timeout);
for (const auto &source : this->loopSourceExs_)
{
source.source->OnFinishSleep();
}
return bRet;
}
bool LoopQueue::WaitAllEx(AuUInt32 timeout)
{
bool bReturnStatus {false};
bool bTimeout {false};
AuUInt32 count {};
@ -627,11 +645,6 @@ namespace Aurora::IO::Loop
AuUInt64 startTime = AuTime::SteadyClockNS();
AuUInt64 endTime = startTime + AuMSToNS<AuUInt64>(timeout);
for (const auto &source : this->loopSourceExs_)
{
source.source->OnPresleep();
}
while (count != index)
{
auto next = AuMin(count - index, AuUInt32(MAXIMUM_WAIT_OBJECTS));
@ -644,6 +657,22 @@ namespace Aurora::IO::Loop
{
StartUserAndTakeOwn();
ConsiderEvicitingTimeoutsAll();
Iterator queueIterator(this);
for (queueIterator.Start(); queueIterator.End() != queueIterator.itr; )
{
auto &source = *queueIterator.itr;
if (queueIterator.startingIndexAnd > index)
{
break;
}
ResetLoopSourceFalseAlarm(queueIterator.itr->source);
queueIterator.Next();
}
StartUserAndTakeOwn_Release();
return false;
}
@ -713,8 +742,6 @@ namespace Aurora::IO::Loop
bShouldRemove = true;
}
source.source->OnFinishSleep();
if (ticked)
{
bReturnStatus |= true;
@ -729,6 +756,7 @@ namespace Aurora::IO::Loop
if (bShouldRemove)
{
AuStaticCast<ILoopSourceEx>(source.source)->OnFinishSleep();
if (source.source->GetType() == ELoopSource::eSourceWin32)
{
@ -947,23 +975,35 @@ namespace Aurora::IO::Loop
{
AU_DEBUG_MEMCRUNCH;
AU_LOCK_GUARD(this->rwMutex_->AsReadable()); // the spurious wake up comes from an event that tells all to release me
for (const auto &source : this->loopSourceExs_)
{
source.source->OnPresleep();
}
auto bRet = WaitAnyNBSpuriousEx(internalEndTime, chuggerIndex, trigger, poll, bTriggerWin32);
for (const auto &source : this->loopSourceExs_)
{
source.source->OnFinishSleep();
}
return bRet;
}
bool LoopQueue::WaitAnyNBSpuriousEx(AuUInt64 internalEndTime, AuUInt32 &chuggerIndex, AuList<AuSPtr<ILoopSource>> *trigger, bool poll, bool &bTriggerWin32)
{
bool status {};
DWORD temp;
AuUInt32 indexOfTriggered {};
AuUInt32 triggeredCount {};
AU_LOCK_GUARD(this->rwMutex_->AsReadable()); // the spurious wake up comes from an event that tells all to release me
if (trigger)
{
trigger->reserve(this->loopSourceExs_.size());
}
for (const auto &source : this->loopSourceExs_)
{
source.source->OnPresleep();
}
if (AuExchange(this->bIOUWin32FastPath, false))
{
status = this->handleArrayOr_.size();
@ -1213,10 +1253,10 @@ namespace Aurora::IO::Loop
}
}
source.source->OnFinishSleep();
if (shouldRemove)
{
AuStaticCast<ILoopSourceEx>(source.source)->OnFinishSleep();
if (source.source->GetType() == ELoopSource::eSourceWin32)
{
SysPanic("?");
@ -1390,12 +1430,9 @@ namespace Aurora::IO::Loop
if (!source.ConsiderTimeout(now))
{
queueIterator.Next();
source.source->OnFinishSleep();
continue;
}
source.source->OnFinishSleep();
if (source.source->GetType() == ELoopSource::eSourceWin32)
{
// Null message loop hack

View File

@ -42,6 +42,7 @@ namespace Aurora::IO::Loop
AuList<AuSPtr<ILoopSource>> PumpNonblockingEx() override;
bool WaitAll(AuUInt32 timeout) override;
bool WaitAllEx(AuUInt32 timeout);
AuUInt32 WaitAny(AuUInt32 timeout) override;
AuList<AuSPtr<ILoopSource>> WaitAnyEx(AuUInt32 timeout) override;
@ -82,6 +83,7 @@ namespace Aurora::IO::Loop
bool IsValid();
bool RemoveSourceNB(const AuSPtr<ILoopSource> &source);
bool WaitAnyNBSpurious(AuUInt64 internalEndTime, AuUInt32 &chuggerIndex, AuList<AuSPtr<ILoopSource>> *trigger, bool poll, bool &bTriggerWin32);
bool WaitAnyNBSpuriousEx(AuUInt64 internalEndTime, AuUInt32 &chuggerIndex, AuList<AuSPtr<ILoopSource>> *trigger, bool poll, bool &bTriggerWin32);
bool ChugWaitAny(AuUInt64 internalEndTime, AuUInt32 &chuggerIndex, AuUInt32 &offset);
bool StartUserAndTakeOwn();