From 73a52552f7ebf647db082ac2659e178ca49d3e95 Mon Sep 17 00:00:00 2001 From: Jamie Reece Wilson Date: Sat, 2 Sep 2023 17:56:15 +0100 Subject: [PATCH] [*] [to revert?] Attempt to mitigate message spam wakeups on older systems Also forces higher latency on Windows 7 --- Source/IO/Loop/LoopQueue.NT.cpp | 60 +++++++++++++++++++++++---------- Source/IO/Loop/LoopQueue.NT.hpp | 1 + 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/Source/IO/Loop/LoopQueue.NT.cpp b/Source/IO/Loop/LoopQueue.NT.cpp index bb84eaf3..770570a4 100644 --- a/Source/IO/Loop/LoopQueue.NT.cpp +++ b/Source/IO/Loop/LoopQueue.NT.cpp @@ -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()) diff --git a/Source/IO/Loop/LoopQueue.NT.hpp b/Source/IO/Loop/LoopQueue.NT.hpp index b616b876..996dcd9a 100644 --- a/Source/IO/Loop/LoopQueue.NT.hpp +++ b/Source/IO/Loop/LoopQueue.NT.hpp @@ -102,6 +102,7 @@ namespace Aurora::IO::Loop bool bIsWinLoop_ {}; bool bIsThreadSafe_ {}; AuList handleArrayOr_; + bool bIOUWin32FastPath {}; AuList handleArrayAnd_; AuList> handleArrayTainted_; AuUInt32 slowTickMs_ {1};