[Local GC] Add three finalization-related operations to GCToEEInterface (#9029)
authorSean Gillespie <sean@swgillespie.me>
Tue, 24 Jan 2017 00:50:51 +0000 (16:50 -0800)
committerGitHub <noreply@github.com>
Tue, 24 Jan 2017 00:50:51 +0000 (16:50 -0800)
* Add three finalization-related operations to GCToEEInterface and utilize them from the GC

* Code review feedback

* Code review feedback

* Fix standalone GC build break

* Repair the standalone GC build

14 files changed:
src/gc/env/gcenv.ee.h
src/gc/gc.cpp
src/gc/gc.h
src/gc/gccommon.cpp
src/gc/gcenv.ee.standalone.inl
src/gc/gcinterface.ee.h
src/gc/gcinterface.h
src/gc/sample/gcenv.ee.cpp
src/vm/crst.h
src/vm/finalizerthread.cpp
src/vm/gcenv.ee.cpp
src/vm/gcenv.ee.h
src/vm/vars.cpp
src/vm/vars.hpp

index beb0c1a..9f7f266 100644 (file)
@@ -66,6 +66,8 @@ public:
     static void DiagWalkLOHSurvivors(void* gcContext);
     static void DiagWalkBGCSurvivors(void* gcContext);
     static void StompWriteBarrier(WriteBarrierParameters* args);
+
+    static void EnableFinalization(bool foundFinalizers);
 };
 
 #endif // __GCENV_EE_H__
index 2dad2ca..578f1db 100644 (file)
@@ -35141,11 +35141,7 @@ GCHeap::GarbageCollectGeneration (unsigned int gen, gc_reason reason)
 #endif //!MULTIPLE_HEAPS
 
 #ifdef FEATURE_PREMORTEM_FINALIZATION
-    if ((!pGenGCHeap->settings.concurrent && pGenGCHeap->settings.found_finalizers) || 
-        FinalizerThread::HaveExtraWorkForFinalizer())
-    {
-        FinalizerThread::EnableFinalization();
-    }
+    GCToEEInterface::EnableFinalization(!pGenGCHeap->settings.concurrent && pGenGCHeap->settings.found_finalizers);
 #endif // FEATURE_PREMORTEM_FINALIZATION
 
     return dd_collection_count (dd);
@@ -36226,7 +36222,7 @@ CFinalize::ScanForFinalization (promote_func* pfn, int gen, BOOL mark_only_p,
         if (hp->settings.concurrent && hp->settings.found_finalizers)
         {
             if (!mark_only_p)
-                FinalizerThread::EnableFinalization();
+                GCToEEInterface::EnableFinalization(true);
         }
     }
 
index 6f8626a..7332e42 100644 (file)
@@ -140,6 +140,7 @@ class DacHeapWalker;
 extern "C" uint32_t* g_gc_card_table;
 extern "C" uint8_t* g_gc_lowest_address;
 extern "C" uint8_t* g_gc_highest_address;
+extern "C" bool g_fFinalizerRunOnShutDown;
 
 namespace WKS {
     ::IGCHeapInternal* CreateGCHeap();
@@ -268,6 +269,11 @@ public:
         return mt->GetBaseSize() >= LARGE_OBJECT_SIZE;
     }
 
+    void SetFinalizeRunOnShutdown(bool value)
+    {
+        g_fFinalizerRunOnShutDown = value;
+    }
+
 protected: 
 public:
 #if defined(FEATURE_BASICFREEZE) && defined(VERIFY_HEAP)
index 0292705..133f05e 100644 (file)
@@ -41,6 +41,7 @@ uint8_t* g_shadow_lowest_address = NULL;
 uint32_t* g_gc_card_table;
 uint8_t* g_gc_lowest_address  = 0;
 uint8_t* g_gc_highest_address = 0;
+bool g_fFinalizerRunOnShutDown = false;
 
 VOLATILE(int32_t) m_GCLock = -1;
 
index 3b64586..e285394 100644 (file)
@@ -173,4 +173,10 @@ inline void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args)
     g_theGCToCLR->StompWriteBarrier(args);
 }
 
+inline void GCToEEInterface::EnableFinalization(bool foundFinalizers)
+{
+    assert(g_theGCToCLR != nullptr);
+    g_theGCToCLR->EnableFinalization(foundFinalizers);
+}
+
 #endif // __GCTOENV_EE_STANDALONE_INL__
index c5f87ef..7c0eea2 100644 (file)
@@ -128,6 +128,11 @@ public:
     // barrier if it needs to be updated.
     virtual
     void StompWriteBarrier(WriteBarrierParameters* args) = 0;
+
+    // Signals to the finalizer thread that there are objects ready to
+    // be finalized.
+    virtual
+    void EnableFinalization(bool foundFinalizers) = 0;
 };
 
 #endif // _GCINTERFACE_EE_H_
index 4ba4e0c..99d79df 100644 (file)
@@ -313,6 +313,10 @@ public:
     // Gets the next finalizable object.
     virtual Object* GetNextFinalizable() = 0;
 
+    // Sets whether or not the GC should report all finalizable objects as
+    // ready to be finalized, instead of only collectable objects.
+    virtual void SetFinalizeRunOnShutdown(bool value) = 0;
+
     /*
     ===========================================================================
     BCL routines. These are routines that are directly exposed by mscorlib
index ac227b4..e95a78d 100644 (file)
@@ -13,8 +13,6 @@ MethodTable * g_pFreeObjectMethodTable;
 
 int32_t g_TrapReturningThreads;
 
-bool g_fFinalizerRunOnShutDown;
-
 EEConfig * g_pConfig;
 
 bool CLREventStatic::CreateManualEventNoThrow(bool bInitialState)
@@ -259,17 +257,12 @@ void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args)
 {
 }
 
-void FinalizerThread::EnableFinalization()
+void GCToEEInterface::EnableFinalization(bool foundFinalizers)
 {
     // Signal to finalizer thread that there are objects to finalize
     // TODO: Implement for finalization
 }
 
-bool FinalizerThread::HaveExtraWorkForFinalizer()
-{
-    return false;
-}
-
 bool IsGCSpecialThread()
 {
     // TODO: Implement for background GC
index 7b47098..c68f406 100644 (file)
@@ -105,7 +105,6 @@ extern DWORD g_fEEShutDown;
 // Total count of Crst lock  of the type (Shutdown) that are currently in use
 extern Volatile<LONG> g_ShutdownCrstUsageCount;
 extern Volatile<LONG> g_fForbidEnterEE;
-extern bool g_fFinalizerRunOnShutDown;
 
 // The CRST.
 class CrstBase
index 2f72b07..4c0f5ac 100644 (file)
@@ -1281,14 +1281,14 @@ BOOL FinalizerThread::FinalizerThreadWatchDog()
             pThread->EnablePreemptiveGC();
         }
         
-        g_fFinalizerRunOnShutDown = TRUE;
+        GCHeapUtilities::GetGCHeap()->SetFinalizeRunOnShutdown(true);
         
         // Wait for finalizer thread to finish finalizing all objects.
         hEventShutDownToFinalizer->Set();
         BOOL fTimeOut = FinalizerThreadWatchDogHelper();
 
         if (!fTimeOut) {
-            g_fFinalizerRunOnShutDown = FALSE;
+            GCHeapUtilities::GetGCHeap()->SetFinalizeRunOnShutdown(false);
         }
         
         // Can not call ExitProcess here if we are in a hosting environment.
@@ -1313,7 +1313,8 @@ BOOL FinalizerThread::FinalizerThreadWatchDog()
         {
             pThread->EnablePreemptiveGC();
         }
-        g_fFinalizerRunOnShutDown = TRUE;
+
+        GCHeapUtilities::GetGCHeap()->SetFinalizeRunOnShutdown(true);
         
         hEventShutDownToFinalizer->Set();
         DWORD status = WAIT_OBJECT_0;
index 792e748..61d0642 100644 (file)
@@ -1308,3 +1308,11 @@ void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args)
         assert(!"unknown WriteBarrierOp enum");
     }
 }
+
+void GCToEEInterface::EnableFinalization(bool foundFinalizers)
+{
+    if (foundFinalizers || FinalizerThread::HaveExtraWorkForFinalizer())
+    {
+        FinalizerThread::EnableFinalization();
+    }
+}
index f431221..9aa3e59 100644 (file)
@@ -42,6 +42,8 @@ public:
     void DiagWalkLOHSurvivors(void* gcContext);
     void DiagWalkBGCSurvivors(void* gcContext);
     void StompWriteBarrier(WriteBarrierParameters* args);
+
+    void EnableFinalization(bool foundFinalizers);
 };
 
 #endif // FEATURE_STANDALONE_GC
index 626ca3c..2ca77ae 100644 (file)
@@ -241,7 +241,6 @@ GVAL_IMPL(SIZE_T, g_runtimeVirtualSize);
 #ifndef DACCESS_COMPILE
 
 Volatile<LONG> g_fForbidEnterEE = false;
-bool g_fFinalizerRunOnShutDown = false;
 bool g_fManagedAttach = false;
 bool g_fNoExceptions = false;
 #ifdef FEATURE_COMINTEROP
index 62d6656..167d8e0 100644 (file)
@@ -592,7 +592,6 @@ EXTERN BOOL g_fSuspendOnShutdown;
 EXTERN BOOL g_fSuspendFinalizerOnShutdown;
 #endif // DACCESS_COMPILE
 EXTERN Volatile<LONG> g_fForbidEnterEE;
-EXTERN bool g_fFinalizerRunOnShutDown;
 GVAL_DECL(bool, g_fProcessDetach);
 EXTERN bool g_fManagedAttach;
 EXTERN bool g_fNoExceptions;