[*] NT fix pre/finish sleep out of balance
[*] Fix some more wait alls
This commit is contained in:
parent
4d454287b8
commit
5233dc7ac8
@ -58,6 +58,6 @@ namespace Aurora::IO::Loop
|
||||
AuUInt32 state_;
|
||||
};
|
||||
|
||||
AuUInt32 uApproxSleepCount;
|
||||
AuUInt32 uApproxSleepCount {};
|
||||
};
|
||||
}
|
@ -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
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user