From 96616e0a1172f3e993d5b27e05add01893128392 Mon Sep 17 00:00:00 2001 From: Pierre Baillargeon Date: Tue, 10 Dec 2024 14:34:14 -0500 Subject: [PATCH] Fix fatal error exit When aborting the process due to a fatal error (for example TF_CODING_ERROR or setting the environment variable TF_FATAL_VERIFY to 1), MayaUSD would get in a deadlock. Fix this by avoiding trying to unregister the diagnostic delegate when logging a fatal error. --- lib/mayaUsd/utils/diagnosticDelegate.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/mayaUsd/utils/diagnosticDelegate.cpp b/lib/mayaUsd/utils/diagnosticDelegate.cpp index 9044b84713..0128e46815 100644 --- a/lib/mayaUsd/utils/diagnosticDelegate.cpp +++ b/lib/mayaUsd/utils/diagnosticDelegate.cpp @@ -143,6 +143,23 @@ class ErrorOnlyDelegate : public UsdUtilsCoalescingDiagnosticDelegate { UsdMayaDiagnosticDelegate::Flush(); + // Note: TfLogCrash will do a hard abort of the process. + // The dynamic libraries will be unloaded in a random order and + // global variable will be destroyed. Unfortunately, USD holds a + // mutex while in the TfLogCrash function and trying to remove the + // diagnostic delegate (_waker) will also try to hold that mutex + // resulting in a dead-lock. Avoid this by avoiding to destroy + // the delegates + // + // Yes, this means we are leaking the delegates, but we are in + // the middle of crashing anyway, so it does not really matter. + + _waker.release(); + _flusher.release(); + _batchedStatuses.release(); + _batchedWarnings.release(); + _batchedErrors.release(); + TfLogCrash( "FATAL ERROR", msg,