X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4929b7f325bed62b338613c63af15c75a185effe..39c935d6d5ee86d153f6f7e6a10d723ae7c57f6f:/src/instr/instr_config.cpp diff --git a/src/instr/instr_config.cpp b/src/instr/instr_config.cpp index f80a3795cc..41d0ca88d4 100644 --- a/src/instr/instr_config.cpp +++ b/src/instr/instr_config.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -23,7 +23,7 @@ XBT_LOG_NEW_CATEGORY(instr, "Logging the behavior of the tracing system (used fo XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration"); std::ofstream tracing_file; -std::map tracing_files; // TI specific +std::map tracing_files; // TI specific double prefix = 0.0; // TI specific constexpr char OPT_TRACING_BASIC[] = "tracing/basic"; @@ -37,7 +37,8 @@ static simgrid::config::Flag trace_enabled{ "tracing", "Enable the tracing system. You have to enable this option to use other tracing options.", false}; static simgrid::config::Flag trace_actor_enabled{ - "tracing/msg/process", // FIXME rename this flag + "tracing/actor", + {"tracing/msg/process"}, // XBT_ATTRIB_DEPRECATED_v330(option alias) "Trace the behavior of all categorized actors, grouping them by host. " "Can be used to track actor location if the simulator does actor migration.", false}; @@ -72,8 +73,8 @@ static simgrid::config::Flag trace_uncategorized{ "To use if the simulator does not use tracing categories but resource utilization have to be traced.", false}; -static simgrid::config::Flag trace_disable_destroy{ - OPT_TRACING_DISABLE_DESTROY, {"tracing/disable_destroy"}, "Disable platform containers destruction.", false}; +static simgrid::config::Flag trace_disable_destroy{OPT_TRACING_DISABLE_DESTROY, + "Disable platform containers destruction.", false}; static simgrid::config::Flag trace_basic{OPT_TRACING_BASIC, "Avoid extended events (impoverished trace file).", false}; @@ -172,7 +173,7 @@ static void print_line(const char* option, const char* desc, const char* longdes { std::string str = std::string("--cfg=") + option + " "; - int len = str.size(); + int len = static_cast(str.size()); XBT_HELP("%s%*.*s %s", str.c_str(), 30 - len, 30 - len, "", desc); if (longdesc != nullptr) { XBT_HELP("%s\n", longdesc); @@ -216,20 +217,24 @@ int trace_precision; /************* * Callbacks * *************/ -xbt::signal Container::on_creation; -xbt::signal Container::on_destruction; -xbt::signal EntityValue::on_creation; -xbt::signal Type::on_creation; -xbt::signal LinkType::on_creation; - -static void on_container_creation_paje(Container& c) +xbt::signal Container::on_creation; +xbt::signal Container::on_destruction; +xbt::signal Type::on_creation; +xbt::signal LinkType::on_creation; +xbt::signal PajeEvent::on_creation; +xbt::signal PajeEvent::on_destruction; +xbt::signal StateEvent::on_destruction; +xbt::signal EntityValue::on_creation; + +static void on_container_creation_paje(const Container& c) { double timestamp = SIMIX_get_clock(); std::stringstream stream; - XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, PAJE_CreateContainer, timestamp); + XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, static_cast(PajeEventType::CreateContainer), + timestamp); - stream << std::fixed << std::setprecision(trace_precision) << PAJE_CreateContainer << " "; + stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::CreateContainer << " "; stream << timestamp << " " << c.get_id() << " " << c.type_->get_id() << " " << c.father_->get_id() << " \""; if (c.get_name().find("rank-") != 0) stream << c.get_name() << "\""; @@ -241,29 +246,27 @@ static void on_container_creation_paje(Container& c) tracing_file << stream.str() << std::endl; } -static void on_container_destruction_paje(Container& c) +static void on_container_destruction_paje(const Container& c) { - // obligation to dump previous events because they might reference the container that is about to be destroyed - last_timestamp_to_dump = SIMIX_get_clock(); - dump_buffer(true); - // trace my destruction, but not if user requests so or if the container is root if (not trace_disable_destroy && &c != Container::get_root()) { std::stringstream stream; double timestamp = SIMIX_get_clock(); - XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, PAJE_DestroyContainer, timestamp); + XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, static_cast(PajeEventType::DestroyContainer), + timestamp); - stream << std::fixed << std::setprecision(trace_precision) << PAJE_DestroyContainer << " "; + stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::DestroyContainer << " "; stream << timestamp << " " << c.type_->get_id() << " " << c.get_id(); XBT_DEBUG("Dump %s", stream.str().c_str()); tracing_file << stream.str() << std::endl; } } -static void on_container_creation_ti(Container& c) +static void on_container_creation_ti(const Container& c) { - XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, PAJE_CreateContainer, SIMIX_get_clock()); + XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, static_cast(PajeEventType::CreateContainer), + SIMIX_get_clock()); // if we are in the mode with only one file static std::ofstream* ti_unique_file = nullptr; @@ -287,14 +290,9 @@ static void on_container_creation_ti(Container& c) tracing_files.insert({&c, ti_unique_file}); } -static void on_container_destruction_ti(Container& c) +static void on_container_destruction_ti(const Container& c) { - // obligation to dump previous events because they might reference the container that is about to be destroyed - last_timestamp_to_dump = SIMIX_get_clock(); - dump_buffer(true); - if (not trace_disable_destroy && &c != Container::get_root()) { - XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, PAJE_DestroyContainer, SIMIX_get_clock()); if (not simgrid::config::get_value("tracing/smpi/format/ti-one-file") || tracing_files.size() == 1) { tracing_files.at(&c)->close(); delete tracing_files.at(&c); @@ -303,11 +301,11 @@ static void on_container_destruction_ti(Container& c) } } -static void on_entity_value_creation(EntityValue& value) +static void on_entity_value_creation(const EntityValue& value) { std::stringstream stream; - XBT_DEBUG("%s: event_type=%u", __func__, PAJE_DefineEntityValue); - stream << std::fixed << std::setprecision(trace_precision) << PAJE_DefineEntityValue; + XBT_DEBUG("%s: event_type=%u", __func__, static_cast(PajeEventType::DefineEntityValue)); + stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::DefineEntityValue; stream << " " << value.get_id() << " " << value.get_father()->get_id() << " " << value.get_name(); if (not value.get_color().empty()) stream << " \"" << value.get_color() << "\""; @@ -315,14 +313,35 @@ static void on_entity_value_creation(EntityValue& value) tracing_file << stream.str() << std::endl; } -static void on_type_creation(Type& type, e_event_type event_type) +static void on_event_creation(PajeEvent& event) +{ + XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, static_cast(event.eventType_), trace_precision, + event.timestamp_); + event.stream_ << std::fixed << std::setprecision(trace_precision); + event.stream_ << event.eventType_ << " " << event.timestamp_ << " "; + event.stream_ << event.get_type()->get_id() << " " << event.get_container()->get_id(); +} + +static void on_event_destruction(const PajeEvent& event) +{ + XBT_DEBUG("Dump %s", event.stream_.str().c_str()); + tracing_file << event.stream_.str() << std::endl; +} + +static void on_state_event_destruction(const StateEvent& event) +{ + if (event.has_extra()) + *tracing_files.at(event.get_container()) << event.stream_.str() << std::endl; +} + +static void on_type_creation(const Type& type, PajeEventType event_type) { - if (event_type == PAJE_DefineLinkType) + if (event_type == PajeEventType::DefineLinkType) return; // this kind of type has to be handled differently std::stringstream stream; stream << std::fixed << std::setprecision(trace_precision); - XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, event_type, trace_precision, 0.); + XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, static_cast(event_type), trace_precision, 0.); stream << event_type << " " << type.get_id() << " " << type.get_father()->get_id() << " " << type.get_name(); if (type.is_colored()) stream << " \"" << type.get_color() << "\""; @@ -330,11 +349,12 @@ static void on_type_creation(Type& type, e_event_type event_type) tracing_file << stream.str() << std::endl; } -static void on_link_type_creation(Type& type, Type& source, Type& dest) +static void on_link_type_creation(const Type& type, const Type& source, const Type& dest) { std::stringstream stream; - XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, PAJE_DefineLinkType, trace_precision, 0.); - stream << PAJE_DefineLinkType << " " << type.get_id() << " " << type.get_father()->get_id(); + XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, static_cast(PajeEventType::DefineLinkType), + trace_precision, 0.); + stream << PajeEventType::DefineLinkType << " " << type.get_id() << " " << type.get_father()->get_id(); stream << " " << source.get_id() << " " << dest.get_id() << " " << type.get_name(); XBT_DEBUG("Dump %s", stream.str().c_str()); tracing_file << stream.str() << std::endl; @@ -370,6 +390,8 @@ static void on_simulation_start() EntityValue::on_creation.connect(on_entity_value_creation); Type::on_creation.connect(on_type_creation); LinkType::on_creation.connect(on_link_type_creation); + PajeEvent::on_creation.connect(on_event_creation); + PajeEvent::on_destruction.connect(on_event_destruction); paje::dump_generator_version(); @@ -385,6 +407,7 @@ static void on_simulation_start() trace_format = TraceFormat::Ti; Container::on_creation.connect(on_container_creation_ti); Container::on_destruction.connect(on_container_destruction_ti); + StateEvent::on_destruction.connect(on_state_event_destruction); } trace_active = true; @@ -433,11 +456,9 @@ void init() config::declare_flag(OPT_TRACING_FORMAT_TI_ONEFILE, "(smpi only) For replay format only : output to one file only", false); - config::alias(OPT_TRACING_FORMAT_TI_ONEFILE, {"tracing/smpi/format/ti_one_file"}); config::declare_flag("tracing/comment", "Add a comment line to the top of the trace file.", ""); config::declare_flag(OPT_TRACING_COMMENT_FILE, "Add the contents of a file as comments to the top of the trace.", ""); - config::alias(OPT_TRACING_COMMENT_FILE, {"tracing/comment_file"}); config::declare_flag("tracing/precision", "Numerical precision used when timestamping events " "(expressed in number of digits after decimal point)",