Do YieldProcessor normalization in preemptive GC mode (#45913)
authorKoundinya Veluri <kouvel@users.noreply.github.com>
Fri, 11 Dec 2020 00:57:19 +0000 (16:57 -0800)
committerGitHub <noreply@github.com>
Fri, 11 Dec 2020 00:57:19 +0000 (01:57 +0100)
- 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

src/coreclr/vm/finalizerthread.cpp
src/coreclr/vm/yieldprocessornormalized.cpp

index b7b7fc6..c89ec91 100644 (file)
@@ -370,7 +370,10 @@ DWORD WINAPI FinalizerThread::FinalizerThreadStart(void *args)
         {
             GetFinalizerThread()->SetBackground(TRUE);
 
-            EnsureYieldProcessorNormalizedInitialized();
+            {
+                GCX_PREEMP();
+                EnsureYieldProcessorNormalizedInitialized();
+            }
 
             while (!fQuitFinalizer)
             {
index 98a7f5f..9154792 100644 (file)
@@ -14,7 +14,13 @@ void InitializeYieldProcessorNormalizedCrst()
 
 static void InitializeYieldProcessorNormalized()
 {
-    WRAPPER_NO_CONTRACT;
+    CONTRACTL
+    {
+        NOTHROW;
+        GC_NOTRIGGER;
+        MODE_PREEMPTIVE;
+    }
+    CONTRACTL_END;
 
     CrstHolder lock(&s_initializeYieldProcessorNormalizedCrst);
 
@@ -92,7 +98,13 @@ static void InitializeYieldProcessorNormalized()
 
 void EnsureYieldProcessorNormalizedInitialized()
 {
-    WRAPPER_NO_CONTRACT;
+    CONTRACTL
+    {
+        NOTHROW;
+        GC_NOTRIGGER;
+        MODE_PREEMPTIVE;
+    }
+    CONTRACTL_END;
 
     if (!s_isYieldProcessorNormalizedInitialized)
     {