From 6afd6964b0dfa2e1f2fb6491ff6ac8e615b7442f Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 14 Sep 2023 09:50:09 -0700
Subject: [PATCH] [release/8.0] Don't shut down event pipe in DLLs on Windows
(#92044)
Trying to enable EventSourceSupport in a shared library project on Native AOT currently results in a build failure since this is actively blocked in the targets. But EventSourceSupport/event pipe mostly work, with some issues (#91762).
The blocking makes it impossible for anyone to run diagnostics on their shared library. This is a regression from .NET 7, where it was at least possible to get GC ETW events in PerfView on Windows.
This changes the blocking to a suppressible warning, and fixes and issue that was causing a shutdown hang.
---
src/coreclr/nativeaot/Bootstrap/main.cpp | 10 +++++++--
.../Microsoft.NETCore.Native.Publish.targets | 3 +--
src/coreclr/nativeaot/Runtime/startup.cpp | 22 ++++++++++++++++---
3 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/src/coreclr/nativeaot/Bootstrap/main.cpp b/src/coreclr/nativeaot/Bootstrap/main.cpp
index cc78cf8d671..c2ff85b50e8 100644
--- a/src/coreclr/nativeaot/Bootstrap/main.cpp
+++ b/src/coreclr/nativeaot/Bootstrap/main.cpp
@@ -93,7 +93,7 @@ static char& __unbox_z = __stop___unbox;
#endif // _MSC_VER
-extern "C" bool RhInitialize();
+extern "C" bool RhInitialize(bool isDll);
extern "C" void RhSetRuntimeInitializationCallback(int (*fPtr)());
extern "C" bool RhRegisterOSModule(void * pModule,
@@ -164,7 +164,13 @@ extern "C" void __managed__Startup();
static int InitializeRuntime()
{
- if (!RhInitialize())
+ if (!RhInitialize(
+#ifdef NATIVEAOT_DLL
+ /* isDll */ true
+#else
+ /* isDll */ false
+#endif
+ ))
return -1;
void * osModule = PalGetModuleHandleFromPointer((void*)&NATIVEAOT_ENTRYPOINT);
diff --git a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Publish.targets b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Publish.targets
index 32eefb307eb..caee0777b30 100644
--- a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Publish.targets
+++ b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Publish.targets
@@ -50,8 +50,7 @@
Text="RuntimeIdentifier is required for native compilation. Try running dotnet publish with the -r option value specified." />
-
-
+
diff --git a/src/coreclr/nativeaot/Runtime/startup.cpp b/src/coreclr/nativeaot/Runtime/startup.cpp
index 32cbab53cb8..5db04aa2776 100644
--- a/src/coreclr/nativeaot/Runtime/startup.cpp
+++ b/src/coreclr/nativeaot/Runtime/startup.cpp
@@ -297,6 +297,10 @@ static void UninitDLL()
Thread* g_threadPerformingShutdown = NULL;
#endif
+#if defined(_WIN32) && defined(FEATURE_PERFTRACING)
+bool g_safeToShutdownTracing;
+#endif
+
static void __cdecl OnProcessExit()
{
#ifdef _WIN32
@@ -309,8 +313,16 @@ static void __cdecl OnProcessExit()
#endif
#ifdef FEATURE_PERFTRACING
- EventPipe_Shutdown();
- DiagnosticServer_Shutdown();
+#ifdef _WIN32
+ // We forgo shutting down event pipe if it wouldn't be safe and could lead to a hang.
+ // If there was an active trace session, the trace will likely be corrupted without
+ // orderly shutdown. See https://github.com/dotnet/runtime/issues/89346.
+ if (g_safeToShutdownTracing)
+#endif
+ {
+ EventPipe_Shutdown();
+ DiagnosticServer_Shutdown();
+ }
#endif
}
@@ -348,7 +360,7 @@ void RuntimeThreadShutdown(void* thread)
#endif
}
-extern "C" bool RhInitialize()
+extern "C" bool RhInitialize(bool isDll)
{
if (!PalInit())
return false;
@@ -357,6 +369,10 @@ extern "C" bool RhInitialize()
atexit(&OnProcessExit);
#endif
+#if defined(_WIN32) && defined(FEATURE_PERFTRACING)
+ g_safeToShutdownTracing = !isDll;
+#endif
+
if (!InitDLL(PalGetModuleHandleFromPointer((void*)&RhInitialize)))
return false;
--
GitLab