X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/8d9632b768c69fa38bfc00cb58fcc9b7f3524755..5ee35ecefd297b90d4f2cb1f1158fdf1e2366360:/main.cpp diff --git a/main.cpp b/main.cpp index fc0843a..102122d 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,7 @@ -#include +#include +#include // strchr #include +#include #include #include #include @@ -26,6 +28,8 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(main); #include "tracing.h" #include "version.h" +#define DATA_DESCR_WIDTH 37 + namespace { // Failure exit status enum { @@ -34,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... @@ -41,8 +46,16 @@ namespace { condition_t* proc_cond; unsigned proc_counter = 0; - statistics comps; statistics loads; + statistics comps; + statistics data_send_amount; + statistics data_recv_amount; + statistics data_send_count; + statistics data_recv_count; + statistics ctrl_send_amount; + statistics ctrl_recv_amount; + statistics ctrl_send_count; + statistics ctrl_recv_count; } @@ -60,8 +73,16 @@ static int simulation_main(int argc, char* argv[]) result = proc->run(); proc_mutex->acquire(); - comps.push(proc->get_comp()); loads.push(proc->get_real_load()); + comps.push(proc->get_comp_amount()); + data_send_amount.push(proc->get_data_send_amount()); + data_recv_amount.push(proc->get_data_recv_amount()); + data_send_count.push(proc->get_data_send_count()); + data_recv_count.push(proc->get_data_recv_count()); + ctrl_send_amount.push(proc->get_ctrl_send_amount()); + ctrl_recv_amount.push(proc->get_ctrl_recv_amount()); + ctrl_send_count.push(proc->get_ctrl_send_count()); + ctrl_recv_count.push(proc->get_ctrl_recv_count()); // Synchronization barrier... // The goal is to circumvent a limitation in SimGrid (at least @@ -77,10 +98,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; } @@ -113,9 +134,31 @@ 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", 39, \ - descr " total/avg./stddev. at exit.........................", \ + XBT_INFO("| %.*s: %g / %g / %g", DATA_DESCR_WIDTH, \ + descr " (total/avg./stddev)................................", \ st.get_sum(), st.get_mean(), st.get_stddev()) int main(int argc, char* argv[]) @@ -144,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); @@ -192,9 +236,9 @@ int main(int argc, char* argv[]) } // Register tracing categories - TRACE_category(TRACE_CAT_COMP); - TRACE_category(TRACE_CAT_CTRL); - TRACE_category(TRACE_CAT_DATA); + TRACE_category_with_color(TRACE_CAT_COMP, TRACE_COLOR_COMP); + TRACE_category_with_color(TRACE_CAT_CTRL, TRACE_COLOR_CTRL); + TRACE_category_with_color(TRACE_CAT_DATA, TRACE_COLOR_DATA); exit_status = EXIT_FAILURE_SIMU; // ===== @@ -211,7 +255,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; // ===== } @@ -239,9 +283,19 @@ int main(int argc, char* argv[]) XBT_INFO(",----[ Results ]"); PR_STATS("Load", loads); PR_STATS("Computation", comps); - XBT_INFO("| Total simulated time...................: %g", + PR_STATS("Data send amount", data_send_amount); + PR_STATS("Data recv amount", data_recv_amount); + PR_STATS("Data send count", data_send_count); + PR_STATS("Data recv count", data_recv_count); + PR_STATS("Ctrl send amount", ctrl_send_amount); + PR_STATS("Ctrl recv amount", ctrl_recv_amount); + PR_STATS("Ctrl send count", ctrl_send_count); + PR_STATS("Ctrl recv count", ctrl_recv_count); + XBT_INFO("| %.*s: %g", DATA_DESCR_WIDTH, + "Total simulated time..................................", simulated_time); - XBT_INFO("| Total simulation time..................: %g", + XBT_INFO("| %.*s: %g", DATA_DESCR_WIDTH, + "Total simulation time.................................", simulation_time.duration()); XBT_INFO("`----"); }