X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1f5cc4e090af49a98da0e25e9ee21a8ce6ce30f8..040d8fa855d2b6ac9884f68108a09b935570be21:/src/plugins/link_energy_wifi.cpp diff --git a/src/plugins/link_energy_wifi.cpp b/src/plugins/link_energy_wifi.cpp index dca8c0453d..2a57a2b21f 100644 --- a/src/plugins/link_energy_wifi.cpp +++ b/src/plugins/link_energy_wifi.cpp @@ -1,23 +1,18 @@ -/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2017-2022. 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. */ -#include #include #include -#include #include -#include -#include "src/surf/network_interface.hpp" -#include "src/surf/network_wifi.hpp" -#include "src/surf/surf_interface.hpp" -#include "src/kernel/lmm/maxmin.hpp" +#include "src/kernel/activity/CommImpl.hpp" +#include "src/kernel/resource/StandardLinkImpl.hpp" +#include "src/kernel/resource/WifiLinkImpl.hpp" #include #include -#include SIMGRID_REGISTER_PLUGIN(link_energy_wifi, "Energy wifi test", &sg_wifi_energy_plugin_init); /** @defgroup plugin_link_energy_wifi Plugin WiFi energy @@ -25,14 +20,14 @@ SIMGRID_REGISTER_PLUGIN(link_energy_wifi, "Energy wifi test", &sg_wifi_energy_pl * This is the WiFi energy plugin, accounting for the dissipated energy of WiFi links. */ -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(link_energy_wifi, surf, "Logging specific to the link energy wifi plugin"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(link_energy_wifi, kernel, "Logging specific to the link energy wifi plugin"); namespace simgrid { namespace plugin { class XBT_PRIVATE LinkEnergyWifi { // associative array keeping size of data already sent for a given flow (required for interleaved actions) - std::map> flowTmp{}; + std::map> flowTmp{}; // WiFi link the plugin instance is attached to s4u::Link* link_{}; @@ -67,7 +62,7 @@ public: LinkEnergyWifi() = delete; /** Update the energy consumed by link_ when transmissions start or end */ - void update(const simgrid::kernel::resource::NetworkAction &); + void update(); /** Update the energy consumed when link_ is destroyed */ void update_destroy(); @@ -103,7 +98,7 @@ xbt::Extension LinkEnergyWifi::EXTENSION_ID; void LinkEnergyWifi::update_destroy() { - auto const* wifi_link = static_cast(link_->get_impl()); + auto const* wifi_link = static_cast(link_->get_impl()); double duration = simgrid::s4u::Engine::get_clock() - prev_update_; prev_update_ = simgrid::s4u::Engine::get_clock(); @@ -116,7 +111,7 @@ void LinkEnergyWifi::update_destroy() XBT_DEBUG("finish eStat_ += %f * %f * (%d+1) | eStat = %f", duration, pIdle_, wifi_link->get_host_count(), eStat_); } -void LinkEnergyWifi::update(const kernel::resource::NetworkAction&) +void LinkEnergyWifi::update() { init_watts_range_list(); @@ -127,7 +122,7 @@ void LinkEnergyWifi::update(const kernel::resource::NetworkAction&) if(duration < 1e-6) return; - auto const* wifi_link = static_cast(link_->get_impl()); + auto const* wifi_link = static_cast(link_->get_impl()); const kernel::lmm::Element* elem = nullptr; @@ -142,7 +137,7 @@ void LinkEnergyWifi::update(const kernel::resource::NetworkAction&) */ double durUsage = 0; while (const auto* var = wifi_link->get_constraint()->get_variable(&elem)) { - auto* action = static_cast(var->get_id()); + auto* action = static_cast(var->get_id()); XBT_DEBUG("cost: %f action value: %f link rate 1: %f link rate 2: %f", action->get_cost(), action->get_rate(), wifi_link->get_host_rate(&action->get_src()), wifi_link->get_host_rate(&action->get_dst())); @@ -269,6 +264,17 @@ void LinkEnergyWifi::init_watts_range_list() } // namespace simgrid using simgrid::plugin::LinkEnergyWifi; +/* **************************** events callback *************************** */ +static void on_communication(const simgrid::kernel::activity::CommImpl& comm) +{ + for (const auto* link : comm.get_traversed_links()) { + if (link != nullptr && link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) { + auto* link_energy = link->extension(); + XBT_DEBUG("Update %s on Comm Start/End", link->get_cname()); + link_energy->update(); + } + } +} void sg_wifi_energy_plugin_init() { @@ -280,12 +286,12 @@ void sg_wifi_energy_plugin_init() /** * Attaching to events: - * - on_creation to initialize the plugin - * - on_destruction to produce final energy results - * - on_communication_state_change: to account the energy when communications are updated - * - on_communicate: '' + * - Link::on_creation to initialize the plugin + * - Link::on_destruction to produce final energy results + * - Link::on_communication_state_change: to account for the energy when communications are updated + * - CommImpl::on_start and CommImpl::on_completion: to account for the energy during communications */ - simgrid::s4u::Link::on_creation.connect([](simgrid::s4u::Link& link) { + simgrid::s4u::Link::on_creation_cb([](simgrid::s4u::Link& link) { // verify the link is appropriate to WiFi energy computations if (link.get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) { XBT_DEBUG("Wifi Link: %s, initialization of wifi energy plugin", link.get_cname()); @@ -296,7 +302,7 @@ void sg_wifi_energy_plugin_init() } }); - simgrid::s4u::Link::on_destruction.connect([](simgrid::s4u::Link const& link) { + simgrid::s4u::Link::on_destruction_cb([](simgrid::s4u::Link const& link) { // output energy values if WiFi link if (link.get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) { link.extension()->update_destroy(); @@ -308,29 +314,16 @@ void sg_wifi_energy_plugin_init() } }); - simgrid::s4u::Link::on_communication_state_change.connect( - [](simgrid::kernel::resource::NetworkAction const& action, - simgrid::kernel::resource::Action::State /* previous */) { - // update WiFi links encountered during the communication - for (auto const* link : action.get_links()) { - if (link != nullptr && link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) { - link->get_iface()->extension()->update(action); - } - } - }); - - simgrid::s4u::Link::on_communicate.connect([](const simgrid::kernel::resource::NetworkAction& action) { - auto const* actionWifi = dynamic_cast(&action); - - if (actionWifi == nullptr) - return; - - auto const* link_src = actionWifi->get_src_link(); - auto const* link_dst = actionWifi->get_dst_link(); - - if(link_src != nullptr) - link_src->get_iface()->extension()->update(action); - if(link_dst != nullptr) - link_dst->get_iface()->extension()->update(action); + simgrid::s4u::Link::on_communication_state_change_cb([](simgrid::kernel::resource::NetworkAction const& action, + simgrid::kernel::resource::Action::State /* previous */) { + // update WiFi links encountered during the communication + for (auto const* link : action.get_links()) { + if (link != nullptr && link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) { + link->get_iface()->extension()->update(); + } + } }); + + simgrid::kernel::activity::CommImpl::on_start.connect(&on_communication); + simgrid::kernel::activity::CommImpl::on_completion.connect(&on_communication); }