[*] [to revert?] Attempt to mitigate message spam wakeups on older systems

Also forces higher latency on Windows 7
This commit is contained in:
Reece Wilson 2023-09-02 17:56:15 +01:00
parent cc6e0358fa
commit 73a52552f7
2 changed files with 43 additions and 18 deletions

View File

@ -950,7 +950,11 @@ namespace Aurora::IO::Loop
source.source->OnPresleep();
}
if ((this->handleArrayOr_.size() > MAXIMUM_WAIT_OBJECTS) || (this->forceChug_))
if (AuExchange(this->bIOUWin32FastPath, false))
{
status = this->handleArrayOr_.size();
}
else if ((this->handleArrayOr_.size() > MAXIMUM_WAIT_OBJECTS) || (this->forceChug_))
{
status = ChugWaitAny(internalEndTime, chuggerIndex, indexOfTriggered);
}
@ -958,32 +962,51 @@ namespace Aurora::IO::Loop
{
AuUInt32 sleepDelta {};
if (internalEndTime)
do
{
if (internalEndTime == AuUInt64(-1))
if (internalEndTime)
{
sleepDelta = INFINITE;
if (internalEndTime == AuUInt64(-1))
{
sleepDelta = INFINITE;
}
else
{
auto now = AuTime::SteadyClockMS();
if (internalEndTime <= now)
{
return false;
}
sleepDelta = internalEndTime - now;
}
}
else
{
auto now = AuTime::SteadyClockMS();
if (internalEndTime <= now)
{
return false;
}
sleepDelta = internalEndTime - now;
sleepDelta = 0;
}
}
else
{
sleepDelta = 0;
}
do
{
if (this->bIsWinLoop_)
{
temp = ::MsgWaitForMultipleObjectsEx(this->handleArrayOr_.size(), this->handleArrayOr_.data(), sleepDelta, QS_ALLINPUT | QS_ALLPOSTMESSAGE, MWMO_INPUTAVAILABLE | MWMO_ALERTABLE);
// TODO: this might be a symptom of something else
if (!AuSwInfo::IsWindows10OrGreater() &&
sleepDelta == INFINITE)
{
auto DoTryIf = [&]
{
temp = ::WaitForMultipleObjectsEx(this->handleArrayOr_.size(), this->handleArrayOr_.data(), false, 4, true);
return WaitToRetStatus(temp);
};
if (!DoTryIf())
{
temp = ::MsgWaitForMultipleObjectsEx(this->handleArrayOr_.size(), this->handleArrayOr_.data(), sleepDelta, QS_ALLINPUT | QS_ALLPOSTMESSAGE, MWMO_INPUTAVAILABLE | MWMO_ALERTABLE);
}
}
else
{
temp = ::MsgWaitForMultipleObjectsEx(this->handleArrayOr_.size(), this->handleArrayOr_.data(), sleepDelta, QS_ALLINPUT | QS_ALLPOSTMESSAGE, MWMO_INPUTAVAILABLE | MWMO_ALERTABLE);
}
}
else
{
@ -1014,6 +1037,7 @@ namespace Aurora::IO::Loop
{
if (poll)
{
this->bIOUWin32FastPath = true;
return true;
}
else if (TryPumpWin32())

View File

@ -102,6 +102,7 @@ namespace Aurora::IO::Loop
bool bIsWinLoop_ {};
bool bIsThreadSafe_ {};
AuList<HANDLE> handleArrayOr_;
bool bIOUWin32FastPath {};
AuList<HANDLE> handleArrayAnd_;
AuList<AuTuple<int, int, HANDLE>> handleArrayTainted_;
AuUInt32 slowTickMs_ {1};