Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>2022-08-29 22:55:47 +0300
committerGitHub <noreply@github.com>2022-08-29 22:55:47 +0300
commitdff9c908b061e1eb9de975e5574c37b34dfad981 (patch)
tree63146e9a324feab08fb92b28b67284074c4d6efe
parentbdb78f48bbe0520be495383b97ff64d09f475f7f (diff)
[release/7.0] [NativeAOT] do not do shutdown for the main thread on Windows (#74712)
* do not do shutdown for the main thread * specialcase the thread that called RhpShutdown instead Co-authored-by: vsadov <8218165+VSadov@users.noreply.github.com>
-rw-r--r--src/coreclr/nativeaot/Runtime/startup.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/coreclr/nativeaot/Runtime/startup.cpp b/src/coreclr/nativeaot/Runtime/startup.cpp
index 0cfa7efe360..62a0f3ba922 100644
--- a/src/coreclr/nativeaot/Runtime/startup.cpp
+++ b/src/coreclr/nativeaot/Runtime/startup.cpp
@@ -401,7 +401,7 @@ static void UninitDLL()
#endif // PROFILE_STARTUP
}
-volatile bool g_processShutdownHasStarted = false;
+volatile Thread* g_threadPerformingShutdown = NULL;
static void DllThreadDetach()
{
@@ -413,7 +413,7 @@ static void DllThreadDetach()
{
// Once shutdown starts, RuntimeThreadShutdown callbacks are ignored, implying that
// it is no longer guaranteed that exiting threads will be detached.
- if (!g_processShutdownHasStarted)
+ if (g_threadPerformingShutdown != NULL)
{
ASSERT_UNCONDITIONALLY("Detaching thread whose home fiber has not been detached");
RhFailFast();
@@ -439,9 +439,17 @@ void RuntimeThreadShutdown(void* thread)
}
#else
ASSERT((Thread*)thread == ThreadStore::GetCurrentThread());
+
+ // Do not do shutdown for the thread that performs the shutdown.
+ // other threads could be terminated before it and could leave TLS locked
+ if ((Thread*)thread == g_threadPerformingShutdown)
+ {
+ return;
+ }
+
#endif
- ThreadStore::DetachCurrentThread(g_processShutdownHasStarted);
+ ThreadStore::DetachCurrentThread(g_threadPerformingShutdown != NULL);
}
extern "C" bool RhInitialize()
@@ -474,11 +482,11 @@ COOP_PINVOKE_HELPER(void, RhpEnableConservativeStackReporting, ())
COOP_PINVOKE_HELPER(void, RhpShutdown, ())
{
// Indicate that runtime shutdown is complete and that the caller is about to start shutting down the entire process.
- g_processShutdownHasStarted = true;
+ g_threadPerformingShutdown = ThreadStore::RawGetCurrentThread();
}
#ifdef _WIN32
-EXTERN_C UInt32_BOOL WINAPI RtuDllMain(HANDLE hPalInstance, uint32_t dwReason, void* /*pvReserved*/)
+EXTERN_C UInt32_BOOL WINAPI RtuDllMain(HANDLE hPalInstance, uint32_t dwReason, void* pvReserved)
{
switch (dwReason)
{