From: Frederic Suter Date: Wed, 25 Mar 2020 15:50:55 +0000 (+0100) Subject: This instrumentation module is a mess ... X-Git-Tag: v3.26~703 X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/6570fa4001065f73218c9869364aba76b91de04e This instrumentation module is a mess ... --- diff --git a/src/instr/instr_config.cpp b/src/instr/instr_config.cpp index 6ca4bf4754..17faca1e30 100644 --- a/src/instr/instr_config.cpp +++ b/src/instr/instr_config.cpp @@ -81,89 +81,8 @@ static simgrid::config::Flag trace_disable_link{"tracing/disable_link", "Do not trace link bandwidth and latency.", false}; static simgrid::config::Flag trace_disable_power{"tracing/disable_power", "Do not trace host power.", false}; -static bool trace_active = false; - simgrid::instr::TraceFormat simgrid::instr::trace_format = simgrid::instr::TraceFormat::Paje; -static void TRACE_start() -{ - if (trace_active) - return; - - // tracing system must be: - // - enabled (with --cfg=tracing:yes) - // - already configured (TRACE_global_init already called) - if (TRACE_is_enabled()) { - instr_define_callbacks(); - - XBT_DEBUG("Tracing starts"); - /* init the tracing module to generate the right output */ - std::string format = simgrid::config::get_value("tracing/smpi/format"); - XBT_DEBUG("Tracing format %s", format.c_str()); - - /* open the trace file(s) */ - std::string filename = TRACE_get_filename(); - tracing_file.open(filename.c_str(), std::ofstream::out); - if (tracing_file.fail()) { - throw simgrid::TracingError( - XBT_THROW_POINT, - simgrid::xbt::string_printf("Tracefile %s could not be opened for writing.", filename.c_str())); - } - - XBT_DEBUG("Filename %s is open for writing", filename.c_str()); - - if (format == "Paje") { - /* output generator version */ - tracing_file << "#This file was generated using SimGrid-" << SIMGRID_VERSION_MAJOR << "." << SIMGRID_VERSION_MINOR - << "." << SIMGRID_VERSION_PATCH << std::endl; - tracing_file << "#["; - for (auto str : simgrid::xbt::cmdline) { - tracing_file << str << " "; - } - tracing_file << "]" << std::endl; - } - - /* output one line comment */ - dump_comment(simgrid::config::get_value("tracing/comment")); - - /* output comment file */ - dump_comment_file(simgrid::config::get_value(OPT_TRACING_COMMENT_FILE)); - - if (format == "Paje") { - /* output Pajé header */ - TRACE_header(TRACE_basic(), TRACE_display_sizes()); - } else - simgrid::instr::trace_format = simgrid::instr::TraceFormat::Ti; - - trace_active = true; - XBT_DEBUG("Tracing is on"); - } -} - -static void TRACE_end() -{ - if (not trace_active) - return; - - /* dump trace buffer */ - TRACE_last_timestamp_to_dump = surf_get_clock(); - TRACE_paje_dump_buffer(true); - - const simgrid::instr::Type* root_type = simgrid::instr::Container::get_root()->type_; - /* destroy all data structures of tracing (and free) */ - delete simgrid::instr::Container::get_root(); - delete root_type; - - /* close the trace files */ - tracing_file.close(); - XBT_DEBUG("Filename %s is closed", TRACE_get_filename().c_str()); - - /* de-activate trace */ - trace_active = false; - XBT_DEBUG("Tracing is off"); - XBT_DEBUG("Tracing system is shutdown"); -} - bool TRACE_needs_platform () { return TRACE_actor_is_enabled() || TRACE_vm_is_enabled() || TRACE_categorized() || TRACE_uncategorized() || @@ -265,39 +184,6 @@ std::string TRACE_get_filename() return simgrid::config::get_value("tracing/filename"); } -void TRACE_global_init() -{ - static bool is_initialized = false; - if (is_initialized) - return; - - is_initialized = true; - - /* name of the tracefile */ - simgrid::config::declare_flag("tracing/filename", "Trace file created by the instrumented SimGrid.", - "simgrid.trace"); - simgrid::config::declare_flag( - "tracing/smpi/format", "Select trace output format used by SMPI. The default is the 'Paje' format. " - "The 'TI' (Time-Independent) format allows for trace replay.", - "Paje"); - - simgrid::config::declare_flag(OPT_TRACING_FORMAT_TI_ONEFILE, - "(smpi only) For replay format only : output to one file only", false); - simgrid::config::alias(OPT_TRACING_FORMAT_TI_ONEFILE, {"tracing/smpi/format/ti_one_file"}); - simgrid::config::declare_flag("tracing/comment", "Add a comment line to the top of the trace file.", ""); - simgrid::config::declare_flag(OPT_TRACING_COMMENT_FILE, - "Add the contents of a file as comments to the top of the trace.", ""); - simgrid::config::alias(OPT_TRACING_COMMENT_FILE, {"tracing/comment_file"}); - simgrid::config::declare_flag("tracing/precision", "Numerical precision used when timestamping events " - "(expressed in number of digits after decimal point)", - 6); - - /* Connect callbacks */ - simgrid::s4u::Engine::on_platform_creation.connect(TRACE_start); - simgrid::s4u::Engine::on_deadlock.connect(TRACE_end); - simgrid::s4u::Engine::on_simulation_end.connect(TRACE_end); -} - static void print_line(const char* option, const char* desc, const char* longdesc) { std::string str = std::string("--cfg=") + option + " "; @@ -336,3 +222,125 @@ void TRACE_help() " time consuming, since it must get the route from each host to other hosts\n" " within the same Autonomous System (AS)."); } + +namespace simgrid { +namespace instr { + +static bool trace_active = false; + +static void on_simulation_start() +{ + if (trace_active) + return; + + // tracing system must be: + // - enabled (with --cfg=tracing:yes) + // - already configured (simgrid::instr::init already called) + if (TRACE_is_enabled()) { + define_callbacks(); + + XBT_DEBUG("Tracing starts"); + + /* init the tracing module to generate the right output */ + std::string format = config::get_value("tracing/smpi/format"); + XBT_DEBUG("Tracing format %s", format.c_str()); + + /* open the trace file(s) */ + std::string filename = TRACE_get_filename(); + tracing_file.open(filename.c_str(), std::ofstream::out); + if (tracing_file.fail()) { + throw TracingError(XBT_THROW_POINT, + xbt::string_printf("Tracefile %s could not be opened for writing.", filename.c_str())); + } + + XBT_DEBUG("Filename %s is open for writing", filename.c_str()); + + if (format == "Paje") { + /* output generator version */ + tracing_file << "#This file was generated using SimGrid-" << SIMGRID_VERSION_MAJOR << "." << SIMGRID_VERSION_MINOR + << "." << SIMGRID_VERSION_PATCH << std::endl; + tracing_file << "#["; + for (auto str : simgrid::xbt::cmdline) { + tracing_file << str << " "; + } + tracing_file << "]" << std::endl; + } + + /* output one line comment */ + std::string comment = simgrid::config::get_value("tracing/comment"); + if (not comment.empty()) + tracing_file << "# " << comment << std::endl; + + /* output comment file */ + dump_comment_file(simgrid::config::get_value(OPT_TRACING_COMMENT_FILE)); + + if (format == "Paje") { + /* output Pajé header */ + TRACE_header(TRACE_basic(), TRACE_display_sizes()); + } else + trace_format = TraceFormat::Ti; + + trace_active = true; + XBT_DEBUG("Tracing is on"); + } +} + +static void on_simulation_end() +{ + if (not trace_active) + return; + + /* dump trace buffer */ + TRACE_last_timestamp_to_dump = surf_get_clock(); + TRACE_paje_dump_buffer(true); + + const Type* root_type = Container::get_root()->type_; + /* destroy all data structures of tracing (and free) */ + delete Container::get_root(); + delete root_type; + + /* close the trace files */ + tracing_file.close(); + XBT_DEBUG("Filename %s is closed", TRACE_get_filename().c_str()); + + /* de-activate trace */ + trace_active = false; + XBT_DEBUG("Tracing is off"); + XBT_DEBUG("Tracing system is shutdown"); +} + +void init() +{ + static bool is_initialized = false; + if (is_initialized) + return; + + is_initialized = true; + + /* name of the tracefile */ + config::declare_flag("tracing/filename", "Trace file created by the instrumented SimGrid.", + "simgrid.trace"); + config::declare_flag("tracing/smpi/format", + "Select trace output format used by SMPI. The default is the 'Paje' format. " + "The 'TI' (Time-Independent) format allows for trace replay.", + "Paje"); + + 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)", + 6); + + /* Connect callbacks */ + s4u::Engine::on_platform_creation.connect(on_simulation_start); + s4u::Engine::on_deadlock.connect(on_simulation_end); + s4u::Engine::on_simulation_end.connect(on_simulation_end); +} +} // namespace instr +} // namespace simgrid diff --git a/src/instr/instr_paje_containers.cpp b/src/instr/instr_paje_containers.cpp index 14c49d9372..1cfd6bfb1f 100644 --- a/src/instr/instr_paje_containers.cpp +++ b/src/instr/instr_paje_containers.cpp @@ -30,7 +30,7 @@ long long int instr_new_paje_id () namespace simgrid { namespace instr { -container_t Container::get_root() +Container* Container::get_root() { return rootContainer; } @@ -38,7 +38,7 @@ container_t Container::get_root() NetZoneContainer::NetZoneContainer(const std::string& name, unsigned int level, NetZoneContainer* father) : Container::Container(name, "", father) { - netpoint_ = simgrid::s4u::Engine::get_instance()->netpoint_by_name_or_null(get_name()); + netpoint_ = s4u::Engine::get_instance()->netpoint_by_name_or_null(get_name()); xbt_assert(netpoint_, "Element '%s' not found", get_cname()); if (father_) { std::string type_name = std::string("L") + std::to_string(level); @@ -56,11 +56,11 @@ RouterContainer::RouterContainer(const std::string& name, Container* father) { xbt_assert(father, "Only the Root container has no father"); - netpoint_ = simgrid::s4u::Engine::get_instance()->netpoint_by_name_or_null(get_name()); + netpoint_ = s4u::Engine::get_instance()->netpoint_by_name_or_null(get_name()); xbt_assert(netpoint_, "Element '%s' not found", get_cname()); } -HostContainer::HostContainer(simgrid::s4u::Host const& host, NetZoneContainer* father) +HostContainer::HostContainer(s4u::Host const& host, NetZoneContainer* father) : Container::Container(host.get_name(), "HOST", father) { xbt_assert(father, "Only the Root container has no father"); @@ -88,9 +88,8 @@ Container::Container(const std::string& name, const std::string& type_name, Cont //register all kinds by name if (not allContainers.emplace(name_, this).second) - throw simgrid::TracingError( - XBT_THROW_POINT, - simgrid::xbt::string_printf("container %s already present in allContainers data structure", get_cname())); + throw TracingError(XBT_THROW_POINT, + xbt::string_printf("container %s already present in allContainers data structure", get_cname())); XBT_DEBUG("Add container name '%s'", get_cname()); } @@ -212,23 +211,17 @@ void Container::log_destruction() StateType* Container::get_state(const std::string& name) { - StateType* ret = static_cast(type_->by_name(name)); - ret->set_calling_container(this); - return ret; + return static_cast(type_->by_name(name)->set_calling_container(this)); } LinkType* Container::get_link(const std::string& name) { - LinkType* ret = static_cast(type_->by_name(name)); - ret->set_calling_container(this); - return ret; + return static_cast(type_->by_name(name)->set_calling_container(this)); } VariableType* Container::get_variable(const std::string& name) { - VariableType* ret = static_cast(type_->by_name(name)); - ret->set_calling_container(this); - return ret; + return static_cast(type_->by_name(name)->set_calling_container(this)); } } // namespace instr } // namespace simgrid diff --git a/src/instr/instr_paje_trace.cpp b/src/instr/instr_paje_trace.cpp index e5fd2dc593..510c59ed80 100644 --- a/src/instr/instr_paje_trace.cpp +++ b/src/instr/instr_paje_trace.cpp @@ -18,12 +18,6 @@ extern std::ofstream tracing_file; static std::vector buffer; -void dump_comment(const std::string& comment) -{ - if (not comment.empty()) - tracing_file << "# " << comment << std::endl; -} - void dump_comment_file(const std::string& filename) { if (filename.empty()) diff --git a/src/instr/instr_paje_types.hpp b/src/instr/instr_paje_types.hpp index 877abc94ad..4cc221cd83 100644 --- a/src/instr/instr_paje_types.hpp +++ b/src/instr/instr_paje_types.hpp @@ -46,7 +46,11 @@ public: return cont == children_.end() ? new T(name, this) : static_cast(cont->second.get()); } - void set_calling_container(Container* container) { issuer_ = container; } + Type* set_calling_container(Container* container) + { + issuer_ = container; + return this; + } void log_definition(e_event_type event_type); void log_definition(Type* source, Type* dest); diff --git a/src/instr/instr_paje_values.cpp b/src/instr/instr_paje_values.cpp index b2c5f6b1e6..0329d7404c 100644 --- a/src/instr/instr_paje_values.cpp +++ b/src/instr/instr_paje_values.cpp @@ -29,5 +29,5 @@ void EntityValue::print() tracing_file << stream.str() << std::endl; } -} -} +} // namespace instr +} // namespace simgrid diff --git a/src/instr/instr_platform.cpp b/src/instr/instr_platform.cpp index fc6fde1ae2..072dd2dc38 100644 --- a/src/instr/instr_platform.cpp +++ b/src/instr/instr_platform.cpp @@ -22,8 +22,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_routing, instr, "Tracing platform hierarchy"); -static std::vector currentContainer; /* push and pop, used only in creation */ - std::string instr_pid(simgrid::s4u::Actor const& proc) { return std::string(proc.get_name()) + "-" + std::to_string(proc.get_pid()); @@ -157,21 +155,26 @@ static void recursiveGraphExtraction(const simgrid::s4u::NetZone* netzone, conta /* * Callbacks */ -static void instr_netzone_on_creation(simgrid::s4u::NetZone const& netzone) + +namespace simgrid { +namespace instr { + +static std::vector currentContainer; /* push and pop, used only in creation */ +static void on_netzone_creation(s4u::NetZone const& netzone) { std::string id = netzone.get_name(); - if (simgrid::instr::Container::get_root() == nullptr) { - simgrid::instr::NetZoneContainer* root = new simgrid::instr::NetZoneContainer(id, 0, nullptr); - xbt_assert(simgrid::instr::Container::get_root() == root); + if (Container::get_root() == nullptr) { + NetZoneContainer* root = new NetZoneContainer(id, 0, nullptr); + xbt_assert(Container::get_root() == root); if (TRACE_smpi_is_enabled()) { - simgrid::instr::ContainerType* mpi = root->type_->by_name_or_create("MPI"); + ContainerType* mpi = root->type_->by_name_or_create("MPI"); if (not TRACE_smpi_is_grouped()) - mpi->by_name_or_create("MPI_STATE"); + mpi->by_name_or_create("MPI_STATE"); root->type_->by_name_or_create("MPI_LINK", mpi, mpi); // TODO See if we can move this to the LoadBalancer plugin root->type_->by_name_or_create("MIGRATE_LINK", mpi, mpi); - mpi->by_name_or_create("MIGRATE_STATE"); + mpi->by_name_or_create("MIGRATE_STATE"); } if (TRACE_needs_platform()) { @@ -181,24 +184,23 @@ static void instr_netzone_on_creation(simgrid::s4u::NetZone const& netzone) } if (TRACE_needs_platform()) { - simgrid::instr::NetZoneContainer* container = - new simgrid::instr::NetZoneContainer(id, currentContainer.size(), currentContainer.back()); + NetZoneContainer* container = new NetZoneContainer(id, currentContainer.size(), currentContainer.back()); currentContainer.push_back(container); } } -static void instr_link_on_creation(simgrid::s4u::Link const& link) +static void on_link_creation(s4u::Link const& link) { if (currentContainer.empty()) // No ongoing parsing. Are you creating the loopback? return; - container_t container = new simgrid::instr::Container(link.get_name(), "LINK", currentContainer.back()); + Container* container = new Container(link.get_name(), "LINK", currentContainer.back()); if ((TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) && (not TRACE_disable_link())) { - simgrid::instr::VariableType* bandwidth = container->type_->by_name_or_create("bandwidth", ""); + VariableType* bandwidth = container->type_->by_name_or_create("bandwidth", ""); bandwidth->set_calling_container(container); bandwidth->set_event(0, link.get_bandwidth()); - simgrid::instr::VariableType* latency = container->type_->by_name_or_create("latency", ""); + VariableType* latency = container->type_->by_name_or_create("latency", ""); latency->set_calling_container(container); latency->set_event(0, link.get_latency()); } @@ -207,17 +209,17 @@ static void instr_link_on_creation(simgrid::s4u::Link const& link) } } -static void instr_host_on_creation(simgrid::s4u::Host const& host) +static void on_host_creation(s4u::Host const& host) { - simgrid::instr::Container* container = new simgrid::instr::HostContainer(host, currentContainer.back()); - const simgrid::instr::Container* root = simgrid::instr::Container::get_root(); + Container* container = new HostContainer(host, currentContainer.back()); + const Container* root = Container::get_root(); if ((TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) && (not TRACE_disable_speed())) { - simgrid::instr::VariableType* speed = container->type_->by_name_or_create("speed", ""); + VariableType* speed = container->type_->by_name_or_create("speed", ""); speed->set_calling_container(container); speed->set_event(0, host.get_speed()); - simgrid::instr::VariableType* cores = container->type_->by_name_or_create("core_count", ""); + VariableType* cores = container->type_->by_name_or_create("core_count", ""); cores->set_calling_container(container); cores->set_event(0, host.get_core_count()); } @@ -226,78 +228,76 @@ static void instr_host_on_creation(simgrid::s4u::Host const& host) container->type_->by_name_or_create("speed_used", "0.5 0.5 0.5"); if (TRACE_smpi_is_enabled() && TRACE_smpi_is_grouped()) { - simgrid::instr::ContainerType* mpi = container->type_->by_name_or_create("MPI"); - mpi->by_name_or_create("MPI_STATE"); + ContainerType* mpi = container->type_->by_name_or_create("MPI"); + mpi->by_name_or_create("MPI_STATE"); // TODO See if we can move this to the LoadBalancer plugin root->type_->by_name_or_create("MIGRATE_LINK", mpi, mpi); - mpi->by_name_or_create("MIGRATE_STATE"); + mpi->by_name_or_create("MIGRATE_STATE"); } } -static void instr_host_on_speed_change(simgrid::s4u::Host const& host) +static void on_host_speed_change(s4u::Host const& host) { - simgrid::instr::Container::by_name(host.get_name()) + Container::by_name(host.get_name()) ->get_variable("speed") ->set_event(surf_get_clock(), host.get_core_count() * host.get_available_speed()); } -static void instr_action_on_state_change(simgrid::kernel::resource::Action const& action, - simgrid::kernel::resource::Action::State /* previous */) +static void on_action_state_change(kernel::resource::Action const& action, + kernel::resource::Action::State /* previous */) { int n = action.get_variable()->get_number_of_constraint(); for (int i = 0; i < n; i++) { double value = action.get_variable()->get_value() * action.get_variable()->get_constraint_weight(i); /* Beware of composite actions: ptasks put links and cpus together. Extra pb: we cannot dynamic_cast from void* */ - simgrid::kernel::resource::Resource* resource = action.get_variable()->get_constraint(i)->get_id(); - const simgrid::kernel::resource::Cpu* cpu = dynamic_cast(resource); + kernel::resource::Resource* resource = action.get_variable()->get_constraint(i)->get_id(); + const kernel::resource::Cpu* cpu = dynamic_cast(resource); if (cpu != nullptr) - TRACE_surf_resource_set_utilization("HOST", "speed_used", cpu->get_cname(), action.get_category(), value, - action.get_last_update(), SIMIX_get_clock() - action.get_last_update()); + resource_set_utilization("HOST", "speed_used", cpu->get_cname(), action.get_category(), value, + action.get_last_update(), SIMIX_get_clock() - action.get_last_update()); - const simgrid::kernel::resource::LinkImpl* link = dynamic_cast(resource); + const kernel::resource::LinkImpl* link = dynamic_cast(resource); if (link != nullptr) - TRACE_surf_resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action.get_category(), value, - action.get_last_update(), SIMIX_get_clock() - action.get_last_update()); + resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action.get_category(), value, + action.get_last_update(), SIMIX_get_clock() - action.get_last_update()); } } -static void instr_link_on_bandwidth_change(simgrid::s4u::Link const& link) +static void on_link_bandwidth_change(s4u::Link const& link) { - simgrid::instr::Container::by_name(link.get_name()) + Container::by_name(link.get_name()) ->get_variable("bandwidth") ->set_event(surf_get_clock(), sg_bandwidth_factor * link.get_bandwidth()); } -static void instr_netpoint_on_creation(simgrid::kernel::routing::NetPoint const& netpoint) +static void on_netpoint_creation(kernel::routing::NetPoint const& netpoint) { if (netpoint.is_router()) - new simgrid::instr::RouterContainer(netpoint.get_name(), currentContainer.back()); + new RouterContainer(netpoint.get_name(), currentContainer.back()); } -static void instr_on_platform_created() +static void on_platform_created() { currentContainer.clear(); std::set* filter = new std::set(); XBT_DEBUG("Starting graph extraction."); - recursiveGraphExtraction(simgrid::s4u::Engine::get_instance()->get_netzone_root(), - simgrid::instr::Container::get_root(), filter); + recursiveGraphExtraction(s4u::Engine::get_instance()->get_netzone_root(), Container::get_root(), filter); XBT_DEBUG("Graph extraction finished."); delete filter; TRACE_paje_dump_buffer(true); } -static void instr_actor_on_creation(simgrid::s4u::Actor const& actor) +static void on_actor_creation(s4u::Actor const& actor) { - const simgrid::instr::Container* root = simgrid::instr::Container::get_root(); - simgrid::instr::Container* container = simgrid::instr::Container::by_name(actor.get_host()->get_name()); + const Container* root = Container::get_root(); + Container* container = Container::by_name(actor.get_host()->get_name()); container->create_child(instr_pid(actor), "ACTOR"); - simgrid::instr::ContainerType* actor_type = - container->type_->by_name_or_create("ACTOR"); - simgrid::instr::StateType* state = actor_type->by_name_or_create("ACTOR_STATE"); + ContainerType* actor_type = container->type_->by_name_or_create("ACTOR"); + StateType* state = actor_type->by_name_or_create("ACTOR_STATE"); state->add_entity_value("suspend", "1 0 1"); state->add_entity_value("sleep", "1 1 0"); state->add_entity_value("receive", "1 0 0"); @@ -310,34 +310,33 @@ static void instr_actor_on_creation(simgrid::s4u::Actor const& actor) actor.on_exit([container_name](bool failed) { if (failed) // kill means that this actor no longer exists, let's destroy it - simgrid::instr::Container::by_name(container_name)->remove_from_parent(); + Container::by_name(container_name)->remove_from_parent(); }); } -static void instr_actor_on_host_change(simgrid::s4u::Actor const& actor, - simgrid::s4u::Host const& /*previous_location*/) +static void on_actor_host_change(s4u::Actor const& actor, s4u::Host const& /*previous_location*/) { static long long int counter = 0; - container_t container = simgrid::instr::Container::by_name(instr_pid(actor)); - simgrid::instr::LinkType* link = simgrid::instr::Container::get_root()->get_link("ACTOR_LINK"); + container_t container = Container::by_name(instr_pid(actor)); + LinkType* link = Container::get_root()->get_link("ACTOR_LINK"); // start link link->start_event(container, "M", std::to_string(counter)); // destroy existing container of this process container->remove_from_parent(); // create new container on the new_host location - simgrid::instr::Container::by_name(actor.get_host()->get_name())->create_child(instr_pid(actor), "ACTOR"); + Container::by_name(actor.get_host()->get_name())->create_child(instr_pid(actor), "ACTOR"); // end link - link->end_event(simgrid::instr::Container::by_name(instr_pid(actor)), "M", std::to_string(counter)); + link->end_event(Container::by_name(instr_pid(actor)), "M", std::to_string(counter)); counter++; } -static void instr_vm_on_creation(simgrid::s4u::Host const& host) +static void on_vm_creation(s4u::Host const& host) { - const simgrid::instr::Container* container = new simgrid::instr::HostContainer(host, currentContainer.back()); - const simgrid::instr::Container* root = simgrid::instr::Container::get_root(); - simgrid::instr::ContainerType* vm = container->type_->by_name_or_create("VM"); - simgrid::instr::StateType* state = vm->by_name_or_create("VM_STATE"); + const Container* container = new HostContainer(host, currentContainer.back()); + const Container* root = Container::get_root(); + ContainerType* vm = container->type_->by_name_or_create("VM"); + StateType* state = vm->by_name_or_create("VM_STATE"); state->add_entity_value("suspend", "1 0 1"); state->add_entity_value("sleep", "1 1 0"); state->add_entity_value("receive", "1 0 0"); @@ -347,81 +346,77 @@ static void instr_vm_on_creation(simgrid::s4u::Host const& host) root->type_->by_name_or_create("VM_ACTOR_LINK", vm, vm); } -void instr_define_callbacks() +void define_callbacks() { // always need the callbacks to zones (we need only the root zone), to create the rootContainer and the rootType // properly if (TRACE_needs_platform()) { - simgrid::s4u::Engine::on_platform_created.connect(instr_on_platform_created); - simgrid::s4u::Host::on_creation.connect(instr_host_on_creation); - simgrid::s4u::Host::on_speed_change.connect(instr_host_on_speed_change); - simgrid::s4u::Link::on_creation.connect(instr_link_on_creation); - simgrid::s4u::Link::on_bandwidth_change.connect(instr_link_on_bandwidth_change); - simgrid::s4u::NetZone::on_seal.connect( - [](simgrid::s4u::NetZone const& /*netzone*/) { currentContainer.pop_back(); }); - simgrid::kernel::routing::NetPoint::on_creation.connect(instr_netpoint_on_creation); + s4u::Engine::on_platform_created.connect(on_platform_created); + s4u::Host::on_creation.connect(on_host_creation); + s4u::Host::on_speed_change.connect(on_host_speed_change); + s4u::Link::on_creation.connect(on_link_creation); + s4u::Link::on_bandwidth_change.connect(on_link_bandwidth_change); + s4u::NetZone::on_seal.connect([](s4u::NetZone const& /*netzone*/) { currentContainer.pop_back(); }); + kernel::routing::NetPoint::on_creation.connect(on_netpoint_creation); } - simgrid::s4u::NetZone::on_creation.connect(instr_netzone_on_creation); + s4u::NetZone::on_creation.connect(on_netzone_creation); - simgrid::kernel::resource::CpuAction::on_state_change.connect(instr_action_on_state_change); - simgrid::s4u::Link::on_communication_state_change.connect(instr_action_on_state_change); + kernel::resource::CpuAction::on_state_change.connect(on_action_state_change); + s4u::Link::on_communication_state_change.connect(on_action_state_change); if (TRACE_actor_is_enabled()) { - simgrid::s4u::Actor::on_creation.connect(instr_actor_on_creation); - simgrid::s4u::Actor::on_destruction.connect([](simgrid::s4u::Actor const& actor) { - auto container = simgrid::instr::Container::by_name_or_null(instr_pid(actor)); + s4u::Actor::on_creation.connect(on_actor_creation); + s4u::Actor::on_destruction.connect([](s4u::Actor const& actor) { + auto container = Container::by_name_or_null(instr_pid(actor)); if (container != nullptr) container->remove_from_parent(); }); - simgrid::s4u::Actor::on_suspend.connect([](simgrid::s4u::Actor const& actor) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("suspend"); - }); - simgrid::s4u::Actor::on_resume.connect([](simgrid::s4u::Actor const& actor) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); - }); - simgrid::s4u::Actor::on_sleep.connect([](simgrid::s4u::Actor const& actor) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("sleep"); + s4u::Actor::on_suspend.connect([](s4u::Actor const& actor) { + Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("suspend"); }); - simgrid::s4u::Actor::on_wake_up.connect([](simgrid::s4u::Actor const& actor) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); + s4u::Actor::on_resume.connect( + [](s4u::Actor const& actor) { Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); }); + s4u::Actor::on_sleep.connect([](s4u::Actor const& actor) { + Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("sleep"); }); - simgrid::s4u::Exec::on_start.connect([](simgrid::s4u::Actor const& actor, simgrid::s4u::Exec const&) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("execute"); + s4u::Actor::on_wake_up.connect( + [](s4u::Actor const& actor) { Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); }); + s4u::Exec::on_start.connect([](simgrid::s4u::Actor const& actor, s4u::Exec const&) { + Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("execute"); }); - simgrid::s4u::Exec::on_completion.connect([](simgrid::s4u::Actor const& actor, simgrid::s4u::Exec const&) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); + s4u::Exec::on_completion.connect([](s4u::Actor const& actor, s4u::Exec const&) { + Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); }); - simgrid::s4u::Comm::on_sender_start.connect([](simgrid::s4u::Actor const& actor) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("send"); + s4u::Comm::on_sender_start.connect([](s4u::Actor const& actor) { + Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("send"); }); - simgrid::s4u::Comm::on_receiver_start.connect([](simgrid::s4u::Actor const& actor) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("receive"); + s4u::Comm::on_receiver_start.connect([](s4u::Actor const& actor) { + Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("receive"); }); - simgrid::s4u::Comm::on_completion.connect([](simgrid::s4u::Actor const& actor) { - simgrid::instr::Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); - }); - simgrid::s4u::Actor::on_host_change.connect(instr_actor_on_host_change); + s4u::Comm::on_completion.connect( + [](s4u::Actor const& actor) { Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); }); + s4u::Actor::on_host_change.connect(on_actor_host_change); } if (TRACE_vm_is_enabled()) { - simgrid::s4u::Host::on_creation.connect(instr_vm_on_creation); - simgrid::s4u::VirtualMachine::on_start.connect([](simgrid::s4u::VirtualMachine const& vm) { - simgrid::instr::Container::by_name(vm.get_name())->get_state("VM_STATE")->push_event("start"); - }); - simgrid::s4u::VirtualMachine::on_started.connect([](simgrid::s4u::VirtualMachine const& vm) { - simgrid::instr::Container::by_name(vm.get_name())->get_state("VM_STATE")->pop_event(); - }); - simgrid::s4u::VirtualMachine::on_suspend.connect([](simgrid::s4u::VirtualMachine const& vm) { - simgrid::instr::Container::by_name(vm.get_name())->get_state("VM_STATE")->push_event("suspend"); + s4u::Host::on_creation.connect(on_vm_creation); + s4u::VirtualMachine::on_start.connect([](s4u::VirtualMachine const& vm) { + Container::by_name(vm.get_name())->get_state("VM_STATE")->push_event("start"); }); - simgrid::s4u::VirtualMachine::on_resume.connect([](simgrid::s4u::VirtualMachine const& vm) { - simgrid::instr::Container::by_name(vm.get_name())->get_state("VM_STATE")->pop_event(); - }); - simgrid::s4u::Host::on_destruction.connect([](simgrid::s4u::Host const& host) { - simgrid::instr::Container::by_name(host.get_name())->remove_from_parent(); + s4u::VirtualMachine::on_started.connect( + [](s4u::VirtualMachine const& vm) { Container::by_name(vm.get_name())->get_state("VM_STATE")->pop_event(); }); + s4u::VirtualMachine::on_suspend.connect([](s4u::VirtualMachine const& vm) { + Container::by_name(vm.get_name())->get_state("VM_STATE")->push_event("suspend"); }); + s4u::VirtualMachine::on_resume.connect( + [](s4u::VirtualMachine const& vm) { Container::by_name(vm.get_name())->get_state("VM_STATE")->pop_event(); }); + s4u::Host::on_destruction.connect( + [](s4u::Host const& host) { Container::by_name(host.get_name())->remove_from_parent(); }); } } +} // namespace instr +} // namespace simgrid + /* * user categories support */ diff --git a/src/instr/instr_private.hpp b/src/instr/instr_private.hpp index c0319cd011..16605e42d7 100644 --- a/src/instr/instr_private.hpp +++ b/src/instr/instr_private.hpp @@ -29,6 +29,11 @@ typedef simgrid::instr::Container* container_t; namespace simgrid { namespace instr { +void init(); +void define_callbacks(); + +void resource_set_utilization(const char* type, const char* name, const char* resource, const std::string& category, + double value, double now, double delta); /* Format of TRACING output. * - paje is the regular format, that we all know @@ -265,25 +270,18 @@ XBT_PUBLIC bool TRACE_smpi_is_computing(); XBT_PUBLIC bool TRACE_smpi_is_sleeping(); XBT_PUBLIC bool TRACE_smpi_view_internals(); -XBT_PRIVATE void TRACE_surf_resource_set_utilization(const char* type, const char* name, const char* resource, - const std::string& category, double value, double now, - double delta); - /* instr_paje.c */ XBT_PRIVATE long long int instr_new_paje_id(); -XBT_PRIVATE void instr_define_callbacks(); void instr_new_variable_type(const std::string& new_typename, const std::string& color); void instr_new_user_variable_type(const std::string& father_type, const std::string& new_typename, const std::string& color); void instr_new_user_state_type(const std::string& father_type, const std::string& new_typename); void instr_new_value_for_user_state_type(const std::string& new_typename, const char* value, const std::string& color); -XBT_PRIVATE void TRACE_global_init(); XBT_PRIVATE void TRACE_help(); XBT_PRIVATE void TRACE_paje_dump_buffer(bool force); XBT_PRIVATE void dump_comment_file(const std::string& filename); -XBT_PRIVATE void dump_comment(const std::string& comment); XBT_PRIVATE std::string TRACE_get_filename(); diff --git a/src/instr/instr_resource_utilization.cpp b/src/instr/instr_resource_utilization.cpp index dddf6403bb..8ab07eb7c4 100644 --- a/src/instr/instr_resource_utilization.cpp +++ b/src/instr/instr_resource_utilization.cpp @@ -9,11 +9,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_resource, instr, "tracing (un)-categorized resource utilization"); -void TRACE_surf_resource_set_utilization(const char* type, const char* name, const char* resource, - const std::string& category, double value, double now, double delta) +namespace simgrid { +namespace instr { +void resource_set_utilization(const char* type, const char* name, const char* resource, const std::string& category, + double value, double now, double delta) { // only trace resource utilization if resource is known by tracing mechanism - container_t container = simgrid::instr::Container::by_name_or_null(resource); + container_t container = Container::by_name_or_null(resource); if (not container || not value) return; @@ -30,3 +32,5 @@ void TRACE_surf_resource_set_utilization(const char* type, const char* name, con container->get_variable(name)->instr_event(now, delta, resource, value); } } +} // namespace instr +} // namespace simgrid diff --git a/src/msg/msg_global.cpp b/src/msg/msg_global.cpp index c5004ba48a..1e5b5c57ec 100644 --- a/src/msg/msg_global.cpp +++ b/src/msg/msg_global.cpp @@ -28,7 +28,7 @@ static void MSG_exit(); */ void MSG_init_nocheck(int* argc, char** argv) { - TRACE_global_init(); + simgrid::instr::init(); if (not msg_global) { simgrid::config::bind_flag(MSG_Global_t::debug_multiple_use, "msg/debug-multiple-use", diff --git a/src/s4u/s4u_Engine.cpp b/src/s4u/s4u_Engine.cpp index a8ab22f137..8922d12cf2 100644 --- a/src/s4u/s4u_Engine.cpp +++ b/src/s4u/s4u_Engine.cpp @@ -42,7 +42,7 @@ Engine* Engine::instance_ = nullptr; /* That singleton is awful, but I don't see Engine::Engine(int* argc, char** argv) : pimpl(new kernel::EngineImpl()) { xbt_assert(Engine::instance_ == nullptr, "It is currently forbidden to create more than one instance of s4u::Engine"); - TRACE_global_init(); + instr::init(); SIMIX_global_init(argc, argv); Engine::instance_ = this; diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index 7cd5672808..7ddc56596c 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -536,7 +536,7 @@ int smpi_main(const char* executable, int argc, char* argv[]) SMPI_switch_data_segment = &smpi_switch_data_segment; smpi_init_options(); - TRACE_global_init(); + simgrid::instr::init(); SIMIX_global_init(&argc, argv); auto engine = simgrid::s4u::Engine::get_instance(); diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index 728f834609..2792bcbf10 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -245,8 +245,8 @@ void NetworkNS3Model::update_actions_state(double now, double delta) action->src_->route_to(action->dst_, route, nullptr); for (auto const& link : route) - TRACE_surf_resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action->get_category(), - (data_delta_sent) / delta, now - delta, delta); + instr::resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action->get_category(), + (data_delta_sent) / delta, now - delta, delta); action->last_sent_ = sgFlow->sent_bytes_; } @@ -255,7 +255,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta) socket_to_destroy.push_back(ns3_socket); XBT_DEBUG("Destroy socket %p of action %p", ns3_socket.c_str(), action); action->set_remains(0); - action->finish(kernel::resource::Action::State::FINISHED); + action->finish(Action::State::FINISHED); } else { XBT_DEBUG("Socket %p sent %u bytes out of %u (%u remaining)", ns3_socket.c_str(), sgFlow->sent_bytes_, sgFlow->total_bytes_, sgFlow->remaining_);