From: Aditya Mandaleeka Date: Thu, 23 Mar 2017 22:49:12 +0000 (-0700) Subject: Separate finalizer thread creation from GC initialization in EE Startup. X-Git-Tag: submit/tizen/20210909.063632~11030^2~7329^2~8 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=06623b96d8b6e086fd3d63603e0b3c21973ceea2;p=platform%2Fupstream%2Fdotnet%2Fruntime.git Separate finalizer thread creation from GC initialization in EE Startup. Commit migrated from https://github.com/dotnet/coreclr/commit/066793782f1100b55cf092f50fa15d6901d6be75 --- diff --git a/src/coreclr/src/vm/ceemain.cpp b/src/coreclr/src/vm/ceemain.cpp index bb82191..c07b24e 100644 --- a/src/coreclr/src/vm/ceemain.cpp +++ b/src/coreclr/src/vm/ceemain.cpp @@ -582,6 +582,23 @@ void InitGSCookie() } } +Volatile g_bIsGarbageCollectorFullyInitialized = FALSE; + +void SetGarbageCollectorFullyInitialized() +{ + LIMITED_METHOD_CONTRACT; + + g_bIsGarbageCollectorFullyInitialized = TRUE; +} + +// Tells whether the garbage collector is fully initialized +// Stronger than IsGCHeapInitialized +BOOL IsGarbageCollectorFullyInitialized() +{ + LIMITED_METHOD_CONTRACT; + + return g_bIsGarbageCollectorFullyInitialized; +} // --------------------------------------------------------------------------- // %%Function: EEStartupHelper @@ -887,6 +904,13 @@ void EEStartupHelper(COINITIEE fFlags) #ifndef CROSSGEN_COMPILE + // This isn't done as part of InitializeGarbageCollector() above because thread + // creation requires AppDomains to have been set up. + FinalizerThread::FinalizerThreadCreate(); + + // Now we really have fully initialized the garbage collector + SetGarbageCollectorFullyInitialized(); + #ifndef FEATURE_PAL // Watson initialization must precede InitializeDebugger() and InstallUnhandledExceptionFilter() // because on CoreCLR when Waston is enabled, debugging service needs to be enabled and UEF will be used. @@ -2378,11 +2402,6 @@ void STDMETHODCALLTYPE CoUninitializeEE(BOOL fIsDllUnloading) } - - - - - //***************************************************************************** BOOL ExecuteDLL_ReturnOrThrow(HRESULT hr, BOOL fFromThunk) { @@ -2402,28 +2421,6 @@ BOOL ExecuteDLL_ReturnOrThrow(HRESULT hr, BOOL fFromThunk) return SUCCEEDED(hr); } - - - - -Volatile g_bIsGarbageCollectorFullyInitialized = FALSE; - -void SetGarbageCollectorFullyInitialized() -{ - LIMITED_METHOD_CONTRACT; - - g_bIsGarbageCollectorFullyInitialized = TRUE; -} - -// Tells whether the garbage collector is fully initialized -// Stronger than IsGCHeapInitialized -BOOL IsGarbageCollectorFullyInitialized() -{ - LIMITED_METHOD_CONTRACT; - - return g_bIsGarbageCollectorFullyInitialized; -} - // // Initialize the Garbage Collector // @@ -2477,12 +2474,6 @@ void InitializeGarbageCollector() hr = pGCHeap->Initialize(); IfFailThrow(hr); - - // Thread for running finalizers... - FinalizerThread::FinalizerThreadCreate(); - - // Now we really have fully initialized the garbage collector - SetGarbageCollectorFullyInitialized(); } /*****************************************************************************/