X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/26173071a8897d8cd839d6a354816bad7d671547..fdbf720097c9e51eef43f0c9811ab5899789349a:/main.cpp diff --git a/main.cpp b/main.cpp index ff1fa1b..c2b1d18 100644 --- a/main.cpp +++ b/main.cpp @@ -1,9 +1,17 @@ -#include +#include +#include // strchr #include +#include #include #include #include +// Don't look at this dirty hack... +// Delete it when THROWF comes in SG/svn. +#ifndef THROWF +#define THROWF(...) THROW1(__VA_ARGS__) +#endif + // Creates log categories XBT_LOG_NEW_CATEGORY(simu, "Root of simulation messages"); XBT_LOG_NEW_SUBCATEGORY(main, simu, "Messages from global infrastructure"); @@ -36,6 +44,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... @@ -95,10 +104,10 @@ static int simulation_main(int argc, char* argv[]) delete proc; } catch (const std::invalid_argument& e) { - THROW1(arg_error, 0, "%s", e.what()); + THROWF(arg_error, 0, "%s", e.what()); } catch (const std::exception& e) { - THROW1(0, 0, "%s", e.what()); + THROWF(0, 0, "%s", e.what()); } return result; } @@ -131,6 +140,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 +193,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); @@ -229,7 +261,7 @@ int main(int argc, char* argv[]) delete proc_mutex; if (res != MSG_OK) - THROW1(0, 0, "MSG_main() failed with status %#x", res); + THROWF(0, 0, "MSG_main() failed with status %#x", res); exit_status = EXIT_NO_FAILURE; // ===== }