- The YieldProcessor normalization takes ~10 ms. In the finalizer thread start function, `Thread::HasStarted()` puts the thread into cooperative GC mode. Switch to preemptive GC mode for the normalization.
Fixes https://github.com/dotnet/runtime/issues/42515
{
GetFinalizerThread()->SetBackground(TRUE);
- EnsureYieldProcessorNormalizedInitialized();
+ {
+ GCX_PREEMP();
+ EnsureYieldProcessorNormalizedInitialized();
+ }
while (!fQuitFinalizer)
{
static void InitializeYieldProcessorNormalized()
{
- WRAPPER_NO_CONTRACT;
+ CONTRACTL
+ {
+ NOTHROW;
+ GC_NOTRIGGER;
+ MODE_PREEMPTIVE;
+ }
+ CONTRACTL_END;
CrstHolder lock(&s_initializeYieldProcessorNormalizedCrst);
void EnsureYieldProcessorNormalizedInitialized()
{
- WRAPPER_NO_CONTRACT;
+ CONTRACTL
+ {
+ NOTHROW;
+ GC_NOTRIGGER;
+ MODE_PREEMPTIVE;
+ }
+ CONTRACTL_END;
if (!s_isYieldProcessorNormalizedInitialized)
{