[*] NT: fix AuLoop::ILoopQueue::WaitAll defects
This commit is contained in:
parent
888e255cca
commit
36349b4d02
@ -654,7 +654,7 @@ namespace Aurora::IO::Loop
|
|||||||
count = this->handleArrayAnd_.size();
|
count = this->handleArrayAnd_.size();
|
||||||
|
|
||||||
AuUInt64 startTime = AuTime::SteadyClockNS();
|
AuUInt64 startTime = AuTime::SteadyClockNS();
|
||||||
AuUInt64 endTime = startTime + AuMSToNS<AuUInt64>(timeout);
|
AuUInt64 endTime = timeout ? startTime + AuMSToNS<AuUInt64>(timeout) : 0;
|
||||||
|
|
||||||
while (count != index)
|
while (count != index)
|
||||||
{
|
{
|
||||||
@ -662,20 +662,34 @@ namespace Aurora::IO::Loop
|
|||||||
|
|
||||||
startTime = AuTime::SteadyClockNS();
|
startTime = AuTime::SteadyClockNS();
|
||||||
|
|
||||||
if (timeout)
|
AuUInt32 timeDelta {};
|
||||||
|
|
||||||
|
if (!timeout)
|
||||||
{
|
{
|
||||||
if (endTime <= startTime)
|
timeDelta = INFINITE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (endTime > startTime)
|
||||||
|
{
|
||||||
|
timeDelta = AuNSToMS<AuUInt32>(endTime - startTime);
|
||||||
|
}
|
||||||
|
else if (endTime == startTime)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
Iterator queueIterator(this);
|
Iterator queueIterator(this);
|
||||||
for (queueIterator.Start(); queueIterator.End() != queueIterator.itr; )
|
for (queueIterator.Start(); queueIterator.End() != queueIterator.itr; )
|
||||||
{
|
{
|
||||||
auto &source = *queueIterator.itr;
|
auto &source = *queueIterator.itr;
|
||||||
|
|
||||||
if (queueIterator.startingIndexAnd > index)
|
if (queueIterator.startingIndexAnd >= index)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetLoopSourceFalseAlarm(queueIterator.itr->source);
|
ResetLoopSourceFalseAlarm(queueIterator.itr->source);
|
||||||
|
|
||||||
queueIterator.Next();
|
queueIterator.Next();
|
||||||
@ -691,12 +705,14 @@ namespace Aurora::IO::Loop
|
|||||||
bFinished = true;
|
bFinished = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!timeDelta)
|
||||||
|
{
|
||||||
|
timeDelta = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto timeDelta = AuNSToMS<AuUInt32>(endTime - startTime); // TODO: cap to last obj
|
|
||||||
|
|
||||||
DWORD status {};
|
DWORD status {};
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (this->bIsWinLoop_ &&
|
if (this->bIsWinLoop_ &&
|
||||||
@ -752,17 +768,12 @@ namespace Aurora::IO::Loop
|
|||||||
auto &source = *queueIterator.itr;
|
auto &source = *queueIterator.itr;
|
||||||
|
|
||||||
auto [ticked, bShouldRemove] = source.DoWork(this, source.source->Singular() ? source.source->GetHandle() : source.source->GetHandles()[0]);
|
auto [ticked, bShouldRemove] = source.DoWork(this, source.source->Singular() ? source.source->GetHandle() : source.source->GetHandles()[0]);
|
||||||
|
|
||||||
if (!bShouldRemove && source.ConsiderTimeout(now))
|
if (!bShouldRemove && source.ConsiderTimeout(now))
|
||||||
{
|
{
|
||||||
bShouldRemove = true;
|
bShouldRemove = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ticked)
|
|
||||||
{
|
|
||||||
bReturnStatus |= true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->handleArrayOr_[queueIterator.startingIndexOr] == AuReinterpretCast<HANDLE>(this->hDummy_))
|
if (this->handleArrayOr_[queueIterator.startingIndexOr] == AuReinterpretCast<HANDLE>(this->hDummy_))
|
||||||
{
|
{
|
||||||
auto handle = AuReinterpretCast<HANDLE>(source.source->Singular() ? source.source->GetHandle() : source.source->GetHandles()[0]);
|
auto handle = AuReinterpretCast<HANDLE>(source.source->Singular() ? source.source->GetHandle() : source.source->GetHandles()[0]);
|
||||||
@ -770,6 +781,72 @@ namespace Aurora::IO::Loop
|
|||||||
this->handleArrayOr_[queueIterator.startingIndexOr] = handle;
|
this->handleArrayOr_[queueIterator.startingIndexOr] = handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!bShouldRemove && !ticked)
|
||||||
|
{
|
||||||
|
bool bCompletedInTimeout = { };
|
||||||
|
AuUInt64 uStartTime {};
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!source.timeoutAbs)
|
||||||
|
{
|
||||||
|
bCompletedInTimeout = source.source->WaitOnAbsExt(0, endTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bCompletedInTimeout = source.source->WaitOnAbsExt(0, !endTime ? AuMSToNS<AuUInt64>(source.timeoutAbs) : AuMin(endTime, AuMSToNS<AuUInt64>(source.timeoutAbs)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bCompletedInTimeout)
|
||||||
|
{
|
||||||
|
AuTupleTie(ticked, bShouldRemove) = source.DoWork(this, -1);
|
||||||
|
if (!ticked)
|
||||||
|
{
|
||||||
|
bCompletedInTimeout = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!bCompletedInTimeout && (!timeout || ((uStartTime = AuTime::SteadyClockNS()) < endTime)));
|
||||||
|
|
||||||
|
if (!bCompletedInTimeout)
|
||||||
|
{
|
||||||
|
Iterator queueIterator2(this);
|
||||||
|
for (queueIterator2.Start(); queueIterator2.End() != queueIterator2.itr; )
|
||||||
|
{
|
||||||
|
auto &source = *queueIterator2.itr;
|
||||||
|
|
||||||
|
if (queueIterator2.startingIndexAnd >= index)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queueIterator2.itr->source)
|
||||||
|
{
|
||||||
|
ResetLoopSourceFalseAlarm(queueIterator2.itr->source);
|
||||||
|
}
|
||||||
|
|
||||||
|
queueIterator2.Next();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StartUserAndTakeOwn())
|
||||||
|
{
|
||||||
|
ConsiderEvicitingTimeoutsAll();
|
||||||
|
StartUserAndTakeOwn_Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ticked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ticked)
|
||||||
|
{
|
||||||
|
bReturnStatus |= true;
|
||||||
|
}
|
||||||
|
|
||||||
if (bShouldRemove)
|
if (bShouldRemove)
|
||||||
{
|
{
|
||||||
AuStaticCast<ILoopSourceEx>(source.source)->OnFinishSleep();
|
AuStaticCast<ILoopSourceEx>(source.source)->OnFinishSleep();
|
||||||
|
Loading…
Reference in New Issue
Block a user