From 67d07faf0f141979ee976a7ec1c9a58b5ecf83b3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Sun, 25 Mar 2018 23:31:26 +0200
Subject: [PATCH] Added a pause-on-error option

pause is activated automatically if output runs in a terminal
---
 main.cpp                | 15 ++++++++++-----
 utils/SignalManager.cpp | 21 ++++++++++++++++++---
 utils/SignalManager.hpp |  2 ++
 3 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/main.cpp b/main.cpp
index 13762d2c4..fc1e3316a 100644
--- a/main.cpp
+++ b/main.cpp
@@ -129,16 +129,20 @@ int main(int argc, char *argv[])
     CLI::App app{"Pastis help"};
 
     app.add_option("number,-n,--number", number, "Number of cells");//->required();
+
+    int threads=-1;
+    app.add_option("--threads", threads, "Number of Kokkos threads")->check(CLI::Range(1,std::numeric_limits<decltype(threads)>::max()));
+
+    std::string colorize="auto";
+    app.add_set("--colorize", colorize, {"auto", "yes", "no"}, "Colorize console output", true);
+
     bool disable_fpe = false;
     app.add_flag("--no-fpe", disable_fpe, "Do not trap floating point exceptions");
     bool disable_signals = false;
     app.add_flag("--no-signal", disable_signals, "Do not catches signals");
 
-    std::string colorize="auto";
-    app.add_set("--colorize", colorize, {"auto", "yes", "no"}, "Colorize console output", true);
-
-    int threads=-1;
-    app.add_option("--threads", threads, "Number of Kokkos threads")->check(CLI::Range(1,std::numeric_limits<decltype(threads)>::max()));
+    std::string pause_on_error="auto";
+    app.add_set("--pause-on-error", pause_on_error, {"auto", "yes", "no"}, "Pause for debugging on unexpected error", true);
 
     std::atexit([](){std::cout << rang::style::reset;});
     try {
@@ -149,6 +153,7 @@ int main(int argc, char *argv[])
 
     ConsoleManager::init(colorize);
     FPEManager::init(not disable_fpe);
+    SignalManager::setPauseForDebug(pause_on_error);
     SignalManager::init(not disable_signals);
   }
   
diff --git a/utils/SignalManager.cpp b/utils/SignalManager.cpp
index 2f873ec19..f82d0f4e6 100644
--- a/utils/SignalManager.cpp
+++ b/utils/SignalManager.cpp
@@ -1,8 +1,17 @@
 #include <SignalManager.hpp>
+#include <ConsoleManager.hpp>
 #include <csignal>
 #include <rang.hpp>
 #include <iomanip>
 
+#warning must create a specific class for pausing and use enum class
+#include <string>
+std::string SignalManager::s_pause_on_error = "auto";
+void SignalManager::setPauseForDebug(const std::string& pause_on_error)
+{
+  s_pause_on_error = pause_on_error;
+}
+
 std::string SignalManager::signalName(int s)
 {
   switch (s) {
@@ -52,9 +61,15 @@ void SignalManager::handler(int s)
 	    << " caught"
 	    << rang::style::reset
 	    << " ***\n";
-  
-  std::signal(SIGINT, SIG_DFL);
-  SignalManager::pauseForDebug();
+
+  if ((ConsoleManager::isTerminal(std::cout) and
+       (s_pause_on_error == "auto")) or
+      (s_pause_on_error == "yes")) {
+    std::signal(SIGINT, SIG_DFL);
+    SignalManager::pauseForDebug();
+  } else {
+    std::exit(0);
+  }
  }
 
 void SignalManager::init(const bool& enable)
diff --git a/utils/SignalManager.hpp b/utils/SignalManager.hpp
index 485820f9c..d4ff3239d 100644
--- a/utils/SignalManager.hpp
+++ b/utils/SignalManager.hpp
@@ -6,10 +6,12 @@
 struct SignalManager
 {
 private:
+  static std::string s_pause_on_error;
   static std::string signalName(int signal);
   static void pauseForDebug();
   static void handler(int signal);
 public:
+  static void setPauseForDebug(const std::string& pause_on_error);
   static void init(const bool& enable);
 };
 
-- 
GitLab