[*] Made past and present NT condvar optional spin steps configurable via the runtime config

This commit is contained in:
Reece Wilson 2023-07-09 20:52:31 +01:00
parent 9a27f3d44b
commit 75b71275e7
2 changed files with 32 additions and 19 deletions

View File

@ -346,19 +346,18 @@ namespace Aurora
struct ThreadingConfig struct ThreadingConfig
{ {
// WARN: these values are not final
bool bNoThreadNames { false }; bool bNoThreadNames { false };
bool bPlatformIsSMPProcessorOptimized { true }; // Whether to attempt to using mm_pause or similar before yielding into the kernel bool bPlatformIsSMPProcessorOptimized { true }; // Whether to attempt to using mm_pause or similar before yielding into the kernel
AuUInt8 uSpinLoopPowerA { 7 }; // Nudgable spinloop power. This is our local userland niceness factor; where 1 << n is the amount of yield instructions to stall for AuUInt8 uSpinLoopPowerA { 7 }; // Nudgable spinloop power. This is our local userland niceness factor; where 1 << n is the amount of yield instructions to stall for
bool bEnableAggressiveScheduling { false }; bool bEnableAggressiveScheduling { false };
bool bEnableAgrSchedulingRatelimit { true }; bool bEnableAgrSchedulingRatelimit { true };
bool bPreferNt51XpMutexesOver8 { false }; // Fun Fact: Undocumented Windows XP APIs are still better than whatever the fuck shit fest they sharted out under Windows Vista and maybe 8.1 bool bPreferNt51XpMutexesOver8 { false };
bool bPerferNt51XpCondvarsOver8 { false }; // Wth the former set of apis, we are still nothing more than a futex intended for nothing more than x86 bittestandset with undefined bool bPerferNt51XpCondvarsOver8 { false };
}; // bahviour on the higher bits, and we're crippled by some annoying thread switch function. Windows Vista superseded the dumb kernel-io bool bPerferNtCondvarModernWinSpin { true }; // to reevaluate (true could cause double spinning depending on the nt version! prediction: true regardless)
// based switching apis everyone thought they had to use with bloat on top of this very same 5.1 era api. bool bPerferNtCondvarOlderWinSpin { true }; // to reevaluate (true could cause excessive context switching in signaling thread! prediction: back to false)
// ~~ And to end it all off, Windows 8.1 wait/wake on address forces relative millisecond precision, in the first (?) MS OS to drop tick based [re]scheduling. ~~ (officially) };
// Our main mutex is one edge case where undcoumented XP era scheduling apis are better than the garbage indiasoft wants you to use in <current year>.
struct RuntimeStartInfo struct RuntimeStartInfo
{ {

View File

@ -93,17 +93,20 @@ namespace Aurora::Threading::Primitives
if (gUseNativeWaitCondvar) if (gUseNativeWaitCondvar)
{ {
// Reverted: 5b495f7fd9495aa55395666e166ac499955215dc // Reverted: 5b495f7fd9495aa55395666e166ac499955215dc
if (!bIOU) if (gRuntimeConfig.threadingConfig.bPerferNtCondvarModernWinSpin)
{ {
bool b = true; if (!bIOU)
#if 0
bIOU = CheckOut(b);
#else
if (CheckOut(b))
{ {
return true; bool b = true;
#if 0
bIOU = CheckOut(b);
#else
if (CheckOut(b))
{
return true;
}
#endif
} }
#endif
} }
AuUInt8 uBlockBit { 1 }; AuUInt8 uBlockBit { 1 };
@ -111,6 +114,16 @@ namespace Aurora::Threading::Primitives
} }
else else
{ {
// Reverted: 5b495f7fd9495aa55395666e166ac499955215dc
if (gRuntimeConfig.threadingConfig.bPerferNtCondvarOlderWinSpin)
{
if (!bIOU)
{
bool b = true;
bIOU = CheckOut(b);
}
}
bRet = pNtWaitForKeyedEvent(gKeyedEventHandle, &this->wlist, 0, &word) != NTSTATUS_TIMEOUT; bRet = pNtWaitForKeyedEvent(gKeyedEventHandle, &this->wlist, 0, &word) != NTSTATUS_TIMEOUT;
} }
@ -135,10 +148,11 @@ namespace Aurora::Threading::Primitives
AuUInt8 uBlockBit { 1 }; AuUInt8 uBlockBit { 1 };
pWakeByAddressAll(&this->wlist); // this is kinda sad pWakeByAddressAll(&this->wlist); // this is kinda sad
bRet = InternalLTSWaitOnAddressHighRes(&this->wlist, &uBlockBit, 1, uEndTimeSteady); // why is this even being called? bRet = InternalLTSWaitOnAddressHighRes(&this->wlist, &uBlockBit, 1, uEndTimeSteady); // why?
} }
else else
{ {
// Obligatory Windows XP+ resched
bRet = pNtWaitForKeyedEvent(gKeyedEventHandle, &this->wlist, 0, nullptr) != NTSTATUS_TIMEOUT; bRet = pNtWaitForKeyedEvent(gKeyedEventHandle, &this->wlist, 0, nullptr) != NTSTATUS_TIMEOUT;
} }