[*] Made past and present NT condvar optional spin steps configurable via the runtime config
This commit is contained in:
parent
9a27f3d44b
commit
75b71275e7
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user