Skip to content
Snippets Groups Projects
Commit 1f7451b6 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Added a simple signal manager and little clean-up for FE manager

parent f53f2cb6
No related branches found
No related tags found
No related merge requests found
......@@ -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,54 +116,31 @@ 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);
}
#warning clean-up and add warning message when release version is run
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;
......
......@@ -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 ---------------
......
......@@ -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();
}
}
......@@ -5,6 +5,7 @@ struct FPEManager
{
static void enable();
static void disable();
static void init(const bool& enable);
};
#endif // FPEMANAGER_HPP
#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';
}
}
#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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment