From 71e689fe5179ca253d878480ba34e2e76a540eab Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 2 May 2021 18:50:49 -0500 Subject: Add ability to suppress pfnTraceErrorCallback for the current thread. Suppress BurnTraceError while logging errors from BurnTraceError. #6378 --- src/burn/stub/stub.cpp | 2 ++ src/libs/dutil/WixToolset.DUtil/dutil.cpp | 27 ++++++++++++++++++++++++++- src/libs/dutil/WixToolset.DUtil/inc/dutil.h | 17 +++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/burn/stub/stub.cpp b/src/burn/stub/stub.cpp index 0cb202e0..090a8dbb 100644 --- a/src/burn/stub/stub.cpp +++ b/src/burn/stub/stub.cpp @@ -101,6 +101,8 @@ static void CALLBACK BurnTraceError( if (fLog) { + DutilSuppressTraceErrorSource(); LogErrorStringArgs(hrError, szFormat, args); + DutilUnsuppressTraceErrorSource(); } } diff --git a/src/libs/dutil/WixToolset.DUtil/dutil.cpp b/src/libs/dutil/WixToolset.DUtil/dutil.cpp index 56b85207..dd4fa8bf 100644 --- a/src/libs/dutil/WixToolset.DUtil/dutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/dutil.cpp @@ -30,6 +30,8 @@ static REPORT_LEVEL Dutil_rlCurrentTrace = REPORT_STANDARD; static BOOL Dutil_fTraceFilenames = FALSE; static DUTIL_CALLBACK_TRACEERROR vpfnTraceErrorCallback = NULL; +thread_local static DWORD vtdwSuppressTraceErrorSource = 0; + DAPI_(HRESULT) DutilInitialize( __in_opt DUTIL_CALLBACK_TRACEERROR pfnTraceErrorCallback @@ -48,6 +50,28 @@ DAPI_(void) DutilUninitialize() vpfnTraceErrorCallback = NULL; } +DAPI_(BOOL) DutilSuppressTraceErrorSource() +{ + if (DWORD_MAX == vtdwSuppressTraceErrorSource) + { + return FALSE; + } + + ++vtdwSuppressTraceErrorSource; + return TRUE; +} + +DAPI_(BOOL) DutilUnsuppressTraceErrorSource() +{ + if (0 == vtdwSuppressTraceErrorSource) + { + return FALSE; + } + + --vtdwSuppressTraceErrorSource; + return TRUE; +} + /******************************************************************* Dutil_SetAssertModule @@ -427,8 +451,9 @@ DAPIV_(void) Dutil_TraceErrorSource( ... ) { + // if this callback is currently suppressed, or // if this is NOT an error report and we're not logging at this level, bail - if (REPORT_ERROR != rl && Dutil_rlCurrentTrace < rl) + if (vtdwSuppressTraceErrorSource || REPORT_ERROR != rl && Dutil_rlCurrentTrace < rl) { return; } diff --git a/src/libs/dutil/WixToolset.DUtil/inc/dutil.h b/src/libs/dutil/WixToolset.DUtil/inc/dutil.h index fc9ec0f4..52da066c 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/dutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/dutil.h @@ -41,6 +41,23 @@ HRESULT DAPI DutilInitialize( *******************************************************************/ void DAPI DutilUninitialize(); + +/******************************************************************** + DutilSuppressTraceErrorSource - tells dutil to skip calling + pfnTraceErrorCallback for the current thread. This is reference + counted, so dutil won't start calling it again until there is an + equal number of calls to DutilUnsuppressTraceErrorSource. + Returns whether the count was incremented. + +*******************************************************************/ +BOOL DAPI DutilSuppressTraceErrorSource(); + +/******************************************************************** + DutilUnsuppressTraceErrorSource - opposite of DutilSuppressTraceErrorSource. + +*******************************************************************/ +BOOL DAPI DutilUnsuppressTraceErrorSource(); + void DAPI Dutil_SetAssertModule(__in HMODULE hAssertModule); void DAPI Dutil_SetAssertDisplayFunction(__in DUTIL_ASSERTDISPLAYFUNCTION pfn); void DAPI Dutil_Assert(__in_z LPCSTR szFile, __in int iLine); -- cgit v1.2.3-55-g6feb