From 1f7451b613a0da8c36a264f21fe030b565ac268e 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 20:43:47 +0200 Subject: [PATCH] Added a simple signal manager and little clean-up for FE manager --- main.cpp | 44 +++++----------------- utils/CMakeLists.txt | 3 +- utils/FPEManager.cpp | 10 +++++ utils/FPEManager.hpp | 1 + utils/SignalManager.cpp | 82 +++++++++++++++++++++++++++++++++++++++++ utils/SignalManager.hpp | 16 ++++++++ 6 files changed, 121 insertions(+), 35 deletions(-) create mode 100644 utils/SignalManager.cpp create mode 100644 utils/SignalManager.hpp diff --git a/main.cpp b/main.cpp index 38b62c63e..4229622bc 100644 --- a/main.cpp +++ b/main.cpp @@ -3,8 +3,10 @@ #include <RevisionInfo.hpp> #include <rang.hpp> #include <FPEManager.hpp> +#include <SignalManager.hpp> #include <CLI/CLI.hpp> +#include <cassert> inline double e(double rho, double p, double gamma) { @@ -114,55 +116,32 @@ void computeExplicitFluxes(const Kokkos::View<double*>& xr, }); } + #warning clean-up and add warning message when release version is run -#include <csignal> - void signal_handler(int s) { - std::cerr << rang::style::reset - << rang::fg::reset - << rang::style::bold; - std::cerr << "to attach gdb to this process run\n"; - std::cerr << "\tgdb -pid " - << rang::fg::red - << getpid() - << rang::fg::reset - << '\n'; - std::cerr << "else press Control-C to exit\n"; - std::cerr << rang::style::reset; - - ::sigset_t sig; - ::sigaddset(&sig,SIGSTOP); - ::sigsuspend(&sig); - } int main(int argc, char *argv[]) { CLI::App app{"Pastis help"}; - long unsigned number = 0; + long unsigned number = 10; app.add_option("number,-n,--number", number, "Number of cells");//->required(); bool disable_fpe = false; - app.add_flag("--disable-fpe", disable_fpe=false, "Traps floating point exceptions"); + app.add_flag("--no-fpe", disable_fpe, "Do not trap floating point exceptions"); + bool disable_signals = false; + app.add_flag("--no-signal", disable_signals, "Catches signals"); int threads=-1; app.add_option("--threads", threads, "Number of Kokkos threads"); - std::cerr << "disable_fpe=" << disable_fpe << '\n' << std::flush; - - // signal_handler(SIGFPE); - std::atexit([](){std::cout << rang::style::reset;}); try { app.parse(argc, argv); } catch (const CLI::ParseError &e) { - std::cout << (e.get_exit_code()==0 ? rang::fg::blue : rang::fg::red); return app.exit(e); } - if (disable_fpe) { - FPEManager::disable(); - } else { - FPEManager::enable(); - } - + FPEManager::init(not disable_fpe); + SignalManager::init(not disable_signals); + std::cout << "Code version: " << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n'; @@ -267,9 +246,6 @@ int main(int argc, char *argv[]) int iteration=0; while((t<tmax) and (iteration<itermax)) { - double test=3; - test /= t; - std::cout << test << '\n'; double dt = 0.4*acoustic_dt(Vj, cj); if (t+dt<tmax) { t+=dt; diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 7d0e57bf4..aa8f05c8e 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -6,7 +6,8 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_library( PastisUtils FPEManager.cpp - RevisionInfo.cpp) + RevisionInfo.cpp + SignalManager.cpp) # --------------- get git revision info --------------- diff --git a/utils/FPEManager.cpp b/utils/FPEManager.cpp index 355b2b6e1..455eb6d83 100644 --- a/utils/FPEManager.cpp +++ b/utils/FPEManager.cpp @@ -48,3 +48,13 @@ void FPEManager::disable() } #endif // PASTIS_HAS_FENV_H + + +void FPEManager::init(const bool& enable) +{ + if (enable) { + FPEManager::enable(); + } else { + FPEManager::disable(); + } +} diff --git a/utils/FPEManager.hpp b/utils/FPEManager.hpp index e2edb238d..0a1ca447f 100644 --- a/utils/FPEManager.hpp +++ b/utils/FPEManager.hpp @@ -5,6 +5,7 @@ struct FPEManager { static void enable(); static void disable(); + static void init(const bool& enable); }; #endif // FPEMANAGER_HPP diff --git a/utils/SignalManager.cpp b/utils/SignalManager.cpp new file mode 100644 index 000000000..2f873ec19 --- /dev/null +++ b/utils/SignalManager.cpp @@ -0,0 +1,82 @@ +#include <SignalManager.hpp> +#include <csignal> +#include <rang.hpp> +#include <iomanip> + +std::string SignalManager::signalName(int s) +{ + switch (s) { + case SIGTERM: return "SIGTERM"; + case SIGSEGV: return "SIGSEGV"; + case SIGINT: return "SIGINT"; + case SIGILL: return "SIGILL"; + case SIGABRT: return "SIGABRT"; + case SIGFPE: return "SIGFPE"; + } + return "SIGNAL undefined!"; +} + +void SignalManager::pauseForDebug() +{ + std::cerr << "\n======================================\n"; + std::cerr << rang::style::reset + << rang::fg::reset + << rang::style::bold; + std::cerr << "to attach gdb to this process run\n"; + std::cerr << "\tgdb -pid " + << rang::fg::red + << getpid() + << rang::fg::reset + << '\n'; + std::cerr << "else press Control-C to exit\n"; + std::cerr << rang::style::reset; + std::cerr << "======================================\n"; + + ::sigset_t sig; + ::sigaddset(&sig,SIGSTOP); + ::sigsuspend(&sig); +} + +//#include <libunwind.h> + +void SignalManager::handler(int s) +{ + std::cerr << "\n *** " + << rang::style::reset + << rang::fg::reset + << rang::style::bold; + std::cerr << "Signal " + << rang::fgB::yellow + << signalName(s) + << rang::fg::reset + << " caught" + << rang::style::reset + << " ***\n"; + + std::signal(SIGINT, SIG_DFL); + SignalManager::pauseForDebug(); + } + +void SignalManager::init(const bool& enable) +{ + if (enable) { + std::signal(SIGFPE, SignalManager::handler); + std::signal(SIGSEGV, SignalManager::handler); + std::signal(SIGTERM, SignalManager::handler); + std::signal(SIGINT, SignalManager::handler); + std::signal(SIGABRT, SignalManager::handler); + std::cout << "Signal management: " + << rang::style::bold + << rang::fgB::green + << "enabled" + << rang::fg::reset + << rang::style::reset << '\n'; + } else { + std::cout << "Signal management: " + << rang::style::bold + << rang::fgB::red + << "disabled" + << rang::fg::reset + << rang::style::reset << '\n'; + } +} diff --git a/utils/SignalManager.hpp b/utils/SignalManager.hpp new file mode 100644 index 000000000..485820f9c --- /dev/null +++ b/utils/SignalManager.hpp @@ -0,0 +1,16 @@ +#ifndef SIGNAL_MANAGER_HPP +#define SIGNAL_MANAGER_HPP + +#include <iostream> + +struct SignalManager +{ +private: + static std::string signalName(int signal); + static void pauseForDebug(); + static void handler(int signal); +public: + static void init(const bool& enable); +}; + +#endif // SIGNAL_MANAGER_HPP -- GitLab