+ double total_running = process::get_total_load_running();
+ double running_ratio = 100.0 * total_running / total_init;
+ if (running_ratio < -opt::load_ratio_threshold) {
+ XBT_ERROR("Negative running load at exit! %g (%g%%) <============",
+ total_running, running_ratio);
+ res = false;
+ } else if (running_ratio > opt::load_ratio_threshold) {
+ XBT_ERROR("Remaining running load at exit! %g (%g%%) <============",
+ total_running, running_ratio);
+ res = false;
+ } else
+ XBT_VERB("Running load at exit looks good: %g (%g%%)",
+ total_running, running_ratio);
+ return res;
+}
+
+static void check_file_access(const std::string& name)
+{
+ if (access(name.c_str(), R_OK) != 0) {
+ std::cerr << "ERROR: cannot access to file \""
+ << name << "\" for reading: " << strerror(errno) << "\n";
+ exit(EXIT_FAILURE_ARGS);
+ }
+}
+
+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 << "ERROR: 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 " (sum/avg/dev) ..................................", \
+ st.get_sum(), st.get_mean(), st.get_stddev())
+
+int main(int argc, char* argv[])
+{
+ int exit_status = 0; // global exit status
+ double simulated_time = -1.0;
+ timestamp elapsed_time(timestamp::wallclock_time);
+ timestamp simulation_time(timestamp::cpu_time);
+ msg_error_t res;
+
+ elapsed_time.start();