From 6de7a4e1d775955bdc0dc8e7c41cd83fefc2d6ec Mon Sep 17 00:00:00 2001
From: Chris Cantwell <c.cantwell@imperial.ac.uk>
Date: Tue, 16 Apr 2019 07:09:12 +0100
Subject: [PATCH] Added option to disable backtrace in ErrorUtil.

---
 library/Demos/LibUtilities/ErrorStream.cpp    |  1 +
 library/LibUtilities/BasicUtils/ErrorUtil.cpp |  1 +
 library/LibUtilities/BasicUtils/ErrorUtil.hpp | 37 +++++++++++++------
 3 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/library/Demos/LibUtilities/ErrorStream.cpp b/library/Demos/LibUtilities/ErrorStream.cpp
index a5fe27faa4..e29a0f90da 100644
--- a/library/Demos/LibUtilities/ErrorStream.cpp
+++ b/library/Demos/LibUtilities/ErrorStream.cpp
@@ -46,6 +46,7 @@ int main(int argc, char *argv[])
     // Set up a stringstream to catch any error output.
     std::stringstream ss;
     ErrorUtil::SetErrorStream(ss);
+    ErrorUtil::SetPrintBacktrace(false);
 
     // Set up output that will be overwritten with exception error (any
     // non-empty string).
diff --git a/library/LibUtilities/BasicUtils/ErrorUtil.cpp b/library/LibUtilities/BasicUtils/ErrorUtil.cpp
index 2c1fa97fd1..c9355396a2 100644
--- a/library/LibUtilities/BasicUtils/ErrorUtil.cpp
+++ b/library/LibUtilities/BasicUtils/ErrorUtil.cpp
@@ -40,5 +40,6 @@ namespace Nektar {
 
 // Defines default outstream in library.
 std::ostream *ErrorUtil::m_outStream = &std::cerr;
+bool          ErrorUtil::m_printBacktrace = true;
 
 }
diff --git a/library/LibUtilities/BasicUtils/ErrorUtil.hpp b/library/LibUtilities/BasicUtils/ErrorUtil.hpp
index 98232ee67e..fdb5c1946f 100644
--- a/library/LibUtilities/BasicUtils/ErrorUtil.hpp
+++ b/library/LibUtilities/BasicUtils/ErrorUtil.hpp
@@ -74,6 +74,11 @@ public:
         m_outStream = &o;
     }
 
+    inline static void SetPrintBacktrace(bool b)
+    {
+        m_printBacktrace = b;
+    }
+
     inline static bool HasCustomErrorStream()
     {
         return m_outStream != &std::cerr;
@@ -117,18 +122,21 @@ public:
         std::string btMessage("");
 #if defined(NEKTAR_FULLDEBUG)
 #ifndef _WIN32
-        void *btArray[40];
-        int btSize;
-        char **btStrings;
+        if (m_printBacktrace)
+        {
+            void *btArray[40];
+            int btSize;
+            char **btStrings;
 
-        btSize = backtrace(btArray, 40);
-        btStrings = backtrace_symbols(btArray, btSize);
+            btSize = backtrace(btArray, 40);
+            btStrings = backtrace_symbols(btArray, btSize);
 
-        for (int i = 0 ; i < btSize ; ++i)
-        {
-            btMessage +=  std::string(btStrings[i]) + "\n";
+            for (int i = 0 ; i < btSize ; ++i)
+            {
+                btMessage +=  std::string(btStrings[i]) + "\n";
+            }
+            free(btStrings);
         }
-        free(btStrings);
 #endif
 #endif
 
@@ -137,7 +145,10 @@ public:
         case efatal:
             if (!rank)
             {
-                (*m_outStream) << btMessage;
+                if (m_printBacktrace)
+                {
+                    (*m_outStream) << btMessage;
+                }
                 (*m_outStream) << "Fatal   : " << baseMsg << std::endl;
             }
 
@@ -155,7 +166,10 @@ public:
         case ewarning:
             if (!rank)
             {
-                (*m_outStream) << btMessage;
+                if (m_printBacktrace)
+                {
+                    (*m_outStream) << btMessage;
+                }
                 (*m_outStream) << "Warning: " << baseMsg << std::endl;
             }
             break;
@@ -176,6 +190,7 @@ public:
 
 private:
     LIB_UTILITIES_EXPORT static std::ostream *m_outStream;
+    LIB_UTILITIES_EXPORT static bool          m_printBacktrace;
 };
 
 /// Assert Level 0 -- Fundamental assert which
-- 
GitLab