X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/26173071a8897d8cd839d6a354816bad7d671547..e846a9dbc8ec5e9f5e05b2cf2c489e3cb2921eb7:/main.cpp?ds=sidebyside diff --git a/main.cpp b/main.cpp index ff1fa1b..76125e9 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,7 @@ -#include +#include +#include // strchr #include +#include #include #include #include @@ -36,6 +38,7 @@ namespace { EXIT_FAILURE_INIT = 0x02, // failed to initialize simulator EXIT_FAILURE_SIMU = 0x04, // simulation failed EXIT_FAILURE_CLEAN = 0x08, // error at cleanup + EXIT_FAILURE_OTHER = 0x10, // other error }; // Cannot be globally initialized... @@ -131,6 +134,28 @@ static void check_for_lost_load() total_running, running_ratio); } +static void signal_handler(int /*sig*/) +{ + if (!opt::exit_request) { + XBT_CRITICAL(">>>>>>>>>>" + " caught CTRL-C: global exit requested " + "<<<<<<<<<<"); + opt::exit_request = true; + } +} + +static void install_signal_handler() +{ + struct sigaction action; + action.sa_handler = signal_handler; + sigemptyset(&action.sa_mask); + action.sa_flags = SA_RESTART; + if (sigaction (SIGINT, &action, NULL) == -1) { + std::cerr << "sigaction: " << strerror(errno) << "\n"; + exit(EXIT_FAILURE_OTHER); + } +} + #define PR_STATS(descr, st) \ XBT_INFO("| %.*s: %g / %g / %g", DATA_DESCR_WIDTH, \ descr " (total/avg./stddev)................................", \ @@ -162,6 +187,7 @@ int main(int argc, char* argv[]) // Note: MSG_global_init() may throw an exception, but it seems // impossible to catch it correctly :-( MSG_global_init(&argc, argv); + install_signal_handler(); // Parse global parameters bool parse_res = opt::parse_args(&argc, argv);