[+] ThreadingConfig::uUWPNanosecondEmulationMaxYields
[+] ThreadingConfig::bUWPNanosecondEmulationCheckFirst
This commit is contained in:
parent
cf363b9f5b
commit
3747fb7c6f
@ -362,6 +362,8 @@ namespace Aurora
|
|||||||
AuUInt64 bPreferLinuxCondMutexSpinTryLock : 1 { true };
|
AuUInt64 bPreferLinuxCondMutexSpinTryLock : 1 { true };
|
||||||
AuUInt64 bPreferEmulatedWakeOnAddress : 1 { false };
|
AuUInt64 bPreferEmulatedWakeOnAddress : 1 { false };
|
||||||
AuUInt64 bPreferRWLockReadLockSpin : 1 { true };
|
AuUInt64 bPreferRWLockReadLockSpin : 1 { true };
|
||||||
|
AuUInt64 bUWPNanosecondEmulationCheckFirst: 1 { false};
|
||||||
|
AuUInt64 uUWPNanosecondEmulationMaxYields : 7 { 12 };
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DummyConfig
|
struct DummyConfig
|
||||||
|
@ -582,6 +582,9 @@ namespace Aurora::Threading
|
|||||||
uRelativeNanoseconds = iDelta;
|
uRelativeNanoseconds = iDelta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto uMaxSwitches = gRuntimeConfig.threadingConfig.uUWPNanosecondEmulationMaxYields;
|
||||||
|
auto bUWPNanosecondEmulationCheckFirst = gRuntimeConfig.threadingConfig.bUWPNanosecondEmulationCheckFirst;
|
||||||
|
|
||||||
// LockN(<1MS) on a platform without that resolution of yielding... damn
|
// LockN(<1MS) on a platform without that resolution of yielding... damn
|
||||||
auto uMS = AuNSToMS<AuUInt32>(uRelativeNanoseconds);
|
auto uMS = AuNSToMS<AuUInt32>(uRelativeNanoseconds);
|
||||||
if (!uMS)
|
if (!uMS)
|
||||||
@ -596,6 +599,7 @@ namespace Aurora::Threading
|
|||||||
}
|
}
|
||||||
|
|
||||||
// second: yield
|
// second: yield
|
||||||
|
unsigned uLimit {};
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (!expect.Compare(pTargetAddress))
|
if (!expect.Compare(pTargetAddress))
|
||||||
@ -604,6 +608,14 @@ namespace Aurora::Threading
|
|||||||
}
|
}
|
||||||
|
|
||||||
AuThreading::ContextYield();
|
AuThreading::ContextYield();
|
||||||
|
|
||||||
|
if (bUWPNanosecondEmulationCheckFirst)
|
||||||
|
{
|
||||||
|
if (uLimit++ > uMaxSwitches)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
while (uAbsTimeSteadyClock > AuTime::SteadyClockNS()); // ...until times up
|
while (uAbsTimeSteadyClock > AuTime::SteadyClockNS()); // ...until times up
|
||||||
}
|
}
|
||||||
@ -638,7 +650,7 @@ namespace Aurora::Threading
|
|||||||
if (!uMS)
|
if (!uMS)
|
||||||
{
|
{
|
||||||
// burn off any remainder cycles by switching contexts (this isnt a very long time usually)
|
// burn off any remainder cycles by switching contexts (this isnt a very long time usually)
|
||||||
if (uLimit++ < 4)
|
if (uLimit++ < uMaxSwitches)
|
||||||
{
|
{
|
||||||
AuThreading::ContextYield();
|
AuThreading::ContextYield();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user