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