* 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
static void DiagWalkLOHSurvivors(void* gcContext);
static void DiagWalkBGCSurvivors(void* gcContext);
static void StompWriteBarrier(WriteBarrierParameters* args);
+
+ static void EnableFinalization(bool foundFinalizers);
};
#endif // __GCENV_EE_H__
#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);
if (hp->settings.concurrent && hp->settings.found_finalizers)
{
if (!mark_only_p)
- FinalizerThread::EnableFinalization();
+ GCToEEInterface::EnableFinalization(true);
}
}
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();
return mt->GetBaseSize() >= LARGE_OBJECT_SIZE;
}
+ void SetFinalizeRunOnShutdown(bool value)
+ {
+ g_fFinalizerRunOnShutDown = value;
+ }
+
protected:
public:
#if defined(FEATURE_BASICFREEZE) && defined(VERIFY_HEAP)
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;
g_theGCToCLR->StompWriteBarrier(args);
}
+inline void GCToEEInterface::EnableFinalization(bool foundFinalizers)
+{
+ assert(g_theGCToCLR != nullptr);
+ g_theGCToCLR->EnableFinalization(foundFinalizers);
+}
+
#endif // __GCTOENV_EE_STANDALONE_INL__
// 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_
// 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
int32_t g_TrapReturningThreads;
-bool g_fFinalizerRunOnShutDown;
-
EEConfig * g_pConfig;
bool CLREventStatic::CreateManualEventNoThrow(bool bInitialState)
{
}
-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
// 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
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.
{
pThread->EnablePreemptiveGC();
}
- g_fFinalizerRunOnShutDown = TRUE;
+
+ GCHeapUtilities::GetGCHeap()->SetFinalizeRunOnShutdown(true);
hEventShutDownToFinalizer->Set();
DWORD status = WAIT_OBJECT_0;
assert(!"unknown WriteBarrierOp enum");
}
}
+
+void GCToEEInterface::EnableFinalization(bool foundFinalizers)
+{
+ if (foundFinalizers || FinalizerThread::HaveExtraWorkForFinalizer())
+ {
+ FinalizerThread::EnableFinalization();
+ }
+}
void DiagWalkLOHSurvivors(void* gcContext);
void DiagWalkBGCSurvivors(void* gcContext);
void StompWriteBarrier(WriteBarrierParameters* args);
+
+ void EnableFinalization(bool foundFinalizers);
};
#endif // FEATURE_STANDALONE_GC
#ifndef DACCESS_COMPILE
Volatile<LONG> g_fForbidEnterEE = false;
-bool g_fFinalizerRunOnShutDown = false;
bool g_fManagedAttach = false;
bool g_fNoExceptions = false;
#ifdef FEATURE_COMINTEROP
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;