-/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2017-2023. 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 <simgrid/plugins/energy.h>
+#include <simgrid/s4u/Comm.hpp>
#include <simgrid/s4u/Engine.hpp>
#include <simgrid/s4u/Link.hpp>
#include "src/kernel/activity/CommImpl.hpp"
#include "src/kernel/resource/StandardLinkImpl.hpp"
#include "src/kernel/resource/WifiLinkImpl.hpp"
+#include "src/simgrid/module.hpp"
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
* 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 {
+namespace simgrid::plugin {
class XBT_PRIVATE LinkEnergyWifi {
// associative array keeping size of data already sent for a given flow (required for interleaved actions)
dur_idle_ += duration;
// add IDLE energy usage, as well as beacons consumption since previous update
- eDyn_ += duration * control_duration_ * wifi_link->get_host_count() * pRx_;
- eStat_ += (duration - (duration * control_duration_)) * pIdle_ * (wifi_link->get_host_count() + 1);
+ const auto host_count = static_cast<double>(wifi_link->get_host_count());
+ eDyn_ += duration * control_duration_ * host_count * pRx_;
+ eStat_ += (duration - (duration * control_duration_)) * pIdle_ * (host_count + 1);
- XBT_DEBUG("finish eStat_ += %f * %f * (%d+1) | eStat = %f", duration, pIdle_, wifi_link->get_host_count(), eStat_);
+ XBT_DEBUG("finish eStat_ += %f * %f * (%f+1) | eStat = %f", duration, pIdle_, host_count, eStat_);
}
void LinkEnergyWifi::update()
XBT_DEBUG("durUsage: %f", durUsage);
// beacons cost
- eDyn_ += duration * control_duration_ * wifi_link->get_host_count() * pRx_;
+ const auto host_count = static_cast<double>(wifi_link->get_host_count());
+ eDyn_ += duration * control_duration_ * host_count * pRx_;
/**
* Same principle as ns3:
* - if idle i.e. get_usage = 0, update P_{stat}
* P_{tot} = P_{dyn}+P_{stat}
*/
- if (link_->get_usage() != 0.0) {
- eDyn_ += /*duration * */ durUsage * ((wifi_link->get_host_count() * pRx_) + pTx_);
- eStat_ += (duration - durUsage) * pIdle_ * (wifi_link->get_host_count() + 1);
- XBT_DEBUG("eDyn += %f * ((%d * %f) + %f) | eDyn = %f (durusage =%f)", durUsage, wifi_link->get_host_count(), pRx_,
- pTx_, eDyn_, durUsage);
+ if (link_->get_load() != 0.0) {
+ eDyn_ += /*duration * */ durUsage * ((host_count * pRx_) + pTx_);
+ eStat_ += (duration - durUsage) * pIdle_ * (host_count + 1);
+ XBT_DEBUG("eDyn += %f * ((%f * %f) + %f) | eDyn = %f (durusage =%f)", durUsage, host_count, pRx_, pTx_, eDyn_,
+ durUsage);
dur_TxRx_ += duration;
} else {
dur_idle_ += duration;
- eStat_ += (duration - (duration * control_duration_)) * pIdle_ * (wifi_link->get_host_count() + 1);
+ eStat_ += (duration - (duration * control_duration_)) * pIdle_ * (host_count + 1);
}
- XBT_DEBUG("eStat_ += %f * %f * (%d+1) | eStat = %f", duration, pIdle_, wifi_link->get_host_count(), eStat_);
+ XBT_DEBUG("eStat_ += %f * %f * (%f+1) | eStat = %f", duration, pIdle_, host_count, eStat_);
}
void LinkEnergyWifi::init_watts_range_list()
Set to 0 if you do not want to compute beacons,
otherwise to the duration of beacons transmissions per second
*/
- const char* beacons_factor = this->link_->get_property("control_duration");
- if(beacons_factor != nullptr) {
+ if (const char* beacons_factor = this->link_->get_property("control_duration")) {
try {
control_duration_ = std::stod(beacons_factor);
} catch (const std::invalid_argument&) {
- throw std::invalid_argument(std::string("Invalid beacons factor value for link ") + this->link_->get_cname());
+ throw std::invalid_argument("Invalid beacons factor value for link " + this->link_->get_name());
}
}
try {
pSleep_ = std::stod(current_power_values.at(3));
} catch (const std::invalid_argument&) {
- throw std::invalid_argument(std::string("Invalid idle power value for link ") + this->link_->get_cname());
+ throw std::invalid_argument("Invalid idle power value for link " + this->link_->get_name());
}
try {
pRx_ = std::stod(current_power_values.at(2));
} catch (const std::invalid_argument&) {
- throw std::invalid_argument(std::string("Invalid idle power value for link ") + this->link_->get_cname());
+ throw std::invalid_argument("Invalid idle power value for link " + this->link_->get_name());
}
try {
pTx_ = std::stod(current_power_values.at(1));
} catch (const std::invalid_argument&) {
- throw std::invalid_argument(std::string("Invalid idle power value for link ") + this->link_->get_cname());
+ throw std::invalid_argument("Invalid idle power value for link " + this->link_->get_name());
}
try {
pIdle_ = std::stod(current_power_values.at(0));
} catch (const std::invalid_argument&) {
- throw std::invalid_argument(std::string("Invalid busy power value for link ") + this->link_->get_cname());
+ throw std::invalid_argument("Invalid busy power value for link " + this->link_->get_name());
}
XBT_DEBUG("Values aa initialized with: pSleep=%f pIdle=%f pTx=%f pRx=%f", pSleep_, pIdle_, pTx_, pRx_);
}
}
-} // namespace plugin
-} // namespace simgrid
+} // namespace simgrid::plugin
using simgrid::plugin::LinkEnergyWifi;
/* **************************** events callback *************************** */
-static void on_communication(const simgrid::kernel::activity::CommImpl& comm)
+static void on_communication(const simgrid::s4u::Comm& comm)
{
- for (const auto* link : comm.get_traversed_links()) {
+ auto* pimpl = static_cast<simgrid::kernel::activity::CommImpl*>(comm.get_impl());
+ for (auto const* link : pimpl->get_traversed_links()) {
if (link != nullptr && link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) {
auto* link_energy = link->extension<LinkEnergyWifi>();
XBT_DEBUG("Update %s on Comm Start/End", link->get_cname());
}
});
- simgrid::kernel::activity::CommImpl::on_start.connect(&on_communication);
- simgrid::kernel::activity::CommImpl::on_completion.connect(&on_communication);
+ simgrid::s4u::Comm::on_start_cb(&on_communication);
+ simgrid::s4u::Comm::on_completion_cb(&on_communication);
}