From 9a15334da52d2eb1b34296f52907f17d78b010bc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 19 Nov 2025 03:27:14 +0000 Subject: [PATCH 1/3] Initial plan From 1cd6434ff900fc13ad4656b9a151eba85099200a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 19 Nov 2025 03:59:28 +0000 Subject: [PATCH 2/3] Fix NativeAOT GC hang by preventing signal queue overflow Co-authored-by: VSadov <8218165+VSadov@users.noreply.github.com> --- src/coreclr/nativeaot/Runtime/unix/PalUnix.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/coreclr/nativeaot/Runtime/unix/PalUnix.cpp b/src/coreclr/nativeaot/Runtime/unix/PalUnix.cpp index 873ae69c28ddf5..476633637ce2a4 100644 --- a/src/coreclr/nativeaot/Runtime/unix/PalUnix.cpp +++ b/src/coreclr/nativeaot/Runtime/unix/PalUnix.cpp @@ -1088,6 +1088,11 @@ HijackFunc* PalGetHijackTarget(HijackFunc* defaultHijackTarget) void PalHijack(Thread* pThreadToHijack) { + if (pThreadToHijack->IsActivationPending()) + { + return; + } + pThreadToHijack->SetActivationPending(true); int status = pthread_kill(pThreadToHijack->GetOSThreadHandle(), INJECT_ACTIVATION_SIGNAL); From 0894b8b67f6e5a89c6d07bd21ce6ba8d8116944d Mon Sep 17 00:00:00 2001 From: vsadov <8218165+VSadov@users.noreply.github.com> Date: Wed, 19 Nov 2025 17:03:07 -0800 Subject: [PATCH 3/3] reset activation pending flag if suspending (in case the signal was lost somehow) --- src/coreclr/nativeaot/Runtime/thread.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/coreclr/nativeaot/Runtime/thread.cpp b/src/coreclr/nativeaot/Runtime/thread.cpp index cbae2f7ed8d4e8..fe65344da8f791 100644 --- a/src/coreclr/nativeaot/Runtime/thread.cpp +++ b/src/coreclr/nativeaot/Runtime/thread.cpp @@ -92,6 +92,9 @@ void Thread::WaitForGC(PInvokeTransitionFrame* pTransitionFrame) ClearState(TSF_Redirected); #endif //FEATURE_SUSPEND_REDIRECTION + // make sure this is cleared - in case a signal is lost or somehow we did not act on it + SetActivationPending(false); + GCHeapUtilities::GetGCHeap()->WaitUntilGCComplete(); // must be in cooperative mode when checking the trap flag