+static void signal_handler(int /*sig*/)
+{
+ if (!opt::exit_request) {
+ XBT_CRITICAL(">>>>>>>>>>"
+ " caught CTRL-C: global exit requested "
+ "<<<<<<<<<<");
+ opt::exit_request = 1;
+ } else {
+ XBT_CRITICAL(">>>>>>>>>>"
+ " caught CTRL-C for the 2nd time: exit immediately "
+ "<<<<<<<<<<");
+ exit(EXIT_FAILURE_INTR);
+ }
+}
+
+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_VALUE(descr, format, ...) \
+ XBT_INFO("| %.*s: " format, DATA_DESCR_WIDTH, \
+ descr ".................................................", \
+ __VA_ARGS__)
+
+#define PR_STATS(descr, st) \
+ XBT_INFO("| %.*s: %g / %g / %g", DATA_DESCR_WIDTH, \
+ descr " (total/avg./stddev).............................", \
+ st.get_sum(), st.get_mean(), st.get_stddev())
+