[*] Cont work on WaitMultipleLoopSources's yield time
This commit is contained in:
parent
b9e8b138f7
commit
64ce35dd87
@ -91,7 +91,7 @@ namespace Aurora::IO::Loop
|
|||||||
AUKN_SYM bool WaitMultipleLoopSources(const AuList<AuSPtr<Loop::ILoopSource>> &lsList,
|
AUKN_SYM bool WaitMultipleLoopSources(const AuList<AuSPtr<Loop::ILoopSource>> &lsList,
|
||||||
AuList<AuSPtr<Loop::ILoopSource>> &signaled,
|
AuList<AuSPtr<Loop::ILoopSource>> &signaled,
|
||||||
bool bAny,
|
bool bAny,
|
||||||
AuOptionalEx<AuUInt32> uTimeoutMS)
|
AuOptionalEx<AuUInt32> optTimeoutMS)
|
||||||
{
|
{
|
||||||
signaled.clear();
|
signaled.clear();
|
||||||
AuList<AuUInt32> reverseList;
|
AuList<AuUInt32> reverseList;
|
||||||
@ -110,9 +110,9 @@ namespace Aurora::IO::Loop
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool bStatus {};
|
bool bStatus {};
|
||||||
if (uTimeoutMS)
|
if (optTimeoutMS)
|
||||||
{
|
{
|
||||||
bStatus = pSource->WaitOn(uTimeoutMS.value());
|
bStatus = pSource->WaitOn(optTimeoutMS.value());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -127,9 +127,10 @@ namespace Aurora::IO::Loop
|
|||||||
return bStatus;
|
return bStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto uTimeoutEnd = uTimeoutMS ?
|
AuUInt64 uTimeoutEnd = optTimeoutMS.has_value() && optTimeoutMS.value() ?
|
||||||
AuTime::SteadyClockNS() + AuMSToNS<AuUInt64>(uTimeoutMS) :
|
AuTime::SteadyClockNS() + AuMSToNS<AuUInt64>(optTimeoutMS) :
|
||||||
0;
|
0;
|
||||||
|
bool bZeroTick { optTimeoutMS && optTimeoutMS.value() == 0 };
|
||||||
|
|
||||||
AU_DEBUG_MEMCRUNCH;
|
AU_DEBUG_MEMCRUNCH;
|
||||||
|
|
||||||
@ -146,7 +147,22 @@ namespace Aurora::IO::Loop
|
|||||||
|
|
||||||
if (entryZero)
|
if (entryZero)
|
||||||
{
|
{
|
||||||
if (!entryZero->WaitOn(uTimeoutMS))
|
bool bStatus {};
|
||||||
|
|
||||||
|
if (!optTimeoutMS || optTimeoutMS.value() == 0)
|
||||||
|
{
|
||||||
|
bStatus = entryZero->WaitOn(0);
|
||||||
|
}
|
||||||
|
else if (bZeroTick)
|
||||||
|
{
|
||||||
|
bStatus = entryZero->IsSignaled();
|
||||||
|
}
|
||||||
|
else if (optTimeoutMS)
|
||||||
|
{
|
||||||
|
bStatus = entryZero->WaitOn(optTimeoutMS.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bStatus)
|
||||||
{
|
{
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
@ -168,20 +184,38 @@ namespace Aurora::IO::Loop
|
|||||||
auto uStartTime = Time::SteadyClockNS();
|
auto uStartTime = Time::SteadyClockNS();
|
||||||
if (uStartTime >= uTimeoutEnd)
|
if (uStartTime >= uTimeoutEnd)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
break;
|
break;
|
||||||
|
#else
|
||||||
|
bZeroTick = true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uTimeoutMS = AuNSToMS<AuInt64>(uTimeoutEnd - uStartTime);
|
uTimeoutMS = AuNSToMS<AuInt64>(uTimeoutEnd - uStartTime);
|
||||||
if (!uTimeoutMS)
|
if (!uTimeoutMS)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
break;
|
break;
|
||||||
|
#else
|
||||||
|
bZeroTick = true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bZeroTick)
|
||||||
|
{
|
||||||
|
if (!lsList[i]->IsSignaled())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (!lsList[i]->WaitOn(uTimeoutMS))
|
if (!lsList[i]->WaitOn(uTimeoutMS))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
reverseList.push_back(i);
|
reverseList.push_back(i);
|
||||||
signaled.push_back(lsList[i]);
|
signaled.push_back(lsList[i]);
|
||||||
@ -247,7 +281,8 @@ namespace Aurora::IO::Loop
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (gRuntimeConfig.threadingConfig.bPlatformIsSMPProcessorOptimized)
|
if (gRuntimeConfig.threadingConfig.bPlatformIsSMPProcessorOptimized &&
|
||||||
|
!bZeroTick)
|
||||||
{
|
{
|
||||||
AuThreadPrimitives::DoTryIf([&]()
|
AuThreadPrimitives::DoTryIf([&]()
|
||||||
{
|
{
|
||||||
@ -255,24 +290,40 @@ namespace Aurora::IO::Loop
|
|||||||
return lsList2.size() != lsList.size() ||
|
return lsList2.size() != lsList.size() ||
|
||||||
!bAnyFound;
|
!bAnyFound;
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
if (bAnyFound || !gRuntimeConfig.threadingConfig.bPlatformIsSMPProcessorOptimized)
|
if (bAnyFound)
|
||||||
|
{
|
||||||
|
DoTheThing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
DoTheThing();
|
DoTheThing();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lsList2.size())
|
if (lsList2.size())
|
||||||
{
|
{
|
||||||
bool bZeroTick { };
|
bZeroTick |= bool(signalTemp.size());
|
||||||
if ((bZeroTick = bool(signalTemp.size())))
|
AuUInt32 uTimeoutMS {};
|
||||||
|
|
||||||
|
if (uTimeoutEnd)
|
||||||
{
|
{
|
||||||
uTimeoutMS = 1;
|
auto uStartTime = Time::SteadyClockNS();
|
||||||
|
if (uStartTime >= uTimeoutEnd)
|
||||||
|
{
|
||||||
|
bZeroTick = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uTimeoutMS = AuNSToMS<AuInt64>(uTimeoutEnd - uStartTime);
|
||||||
|
if (!uTimeoutMS)
|
||||||
|
{
|
||||||
|
bZeroTick = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(AURORA_IS_MODERNNT_DERIVED)
|
#if defined(AURORA_IS_MODERNNT_DERIVED)
|
||||||
signaled = WaitMultipleOrObjects(lsList2, bZeroTick, uTimeoutMS);
|
signaled = WaitMultipleOrObjects(lsList2, bZeroTick, uTimeoutMS);
|
||||||
bTimedout = uTimeoutMS && !bZeroTick ?
|
bTimedout = uTimeoutEnd && uTimeoutMS && !bZeroTick ?
|
||||||
Time::SteadyClockNS() >= uTimeoutEnd :
|
Time::SteadyClockNS() >= uTimeoutEnd :
|
||||||
false;
|
false;
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user