[*] [to revert?] Attempt to mitigate message spam wakeups on older systems
Also forces higher latency on Windows 7
This commit is contained in:
parent
cc6e0358fa
commit
73a52552f7
@ -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())
|
||||
|
@ -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};
|
||||
|
Loading…
Reference in New Issue
Block a user