-/* 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/Exception.hpp"
#include "simgrid/host.h"
#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/surf/surf_interface.hpp"
+#include "src/simgrid/module.hpp"
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
and then use the following function to retrieve the consumption of a given link: sg_link_get_consumed_energy().
*/
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(link_energy, surf, "Logging specific to the SURF LinkEnergy plugin");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(link_energy, kernel, "Logging specific to the LinkEnergy plugin");
-namespace simgrid {
-namespace plugin {
+namespace simgrid::plugin {
class LinkEnergy {
s4u::Link* link_{};
try {
idle_ = std::stod(current_power_values.front());
} 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 {
busy_ = std::stod(current_power_values.back());
} 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());
}
}
}
double power_slope = busy_ - idle_;
- double normalized_link_usage = link_->get_usage() / link_->get_bandwidth();
+ double normalized_link_usage = link_->get_load() / link_->get_bandwidth();
double dynamic_power = power_slope * normalized_link_usage;
return idle_ + dynamic_power;
double LinkEnergy::get_consumed_energy()
{
if (last_updated_ < simgrid::s4u::Engine::get_clock()) // We need to simcall this as it modifies the environment
- kernel::actor::simcall(std::bind(&LinkEnergy::update, this));
+ kernel::actor::simcall_answered(std::bind(&LinkEnergy::update, this));
return this->total_energy_;
}
-} // namespace plugin
-} // namespace simgrid
+} // namespace simgrid::plugin
using simgrid::plugin::LinkEnergy;
XBT_INFO("Total energy over all links: %f", total_energy);
}
-static void on_communication(const simgrid::kernel::activity::CommImpl& comm)
+static void on_communication(const simgrid::s4u::Comm& comm)
{
- for (auto const* link : comm.get_traversed_links()) {
+ const 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) {
XBT_DEBUG("Update %s on Comm Start/End", link->get_cname());
link->extension<LinkEnergy>()->update();
}
}
}
+
/* **************************** Public interface *************************** */
int sg_link_energy_is_inited()
xbt_assert(sg_host_count() == 0, "Please call sg_link_energy_plugin_init() before initializing the platform.");
- simgrid::s4u::Link::on_creation.connect([](simgrid::s4u::Link& link) {
+ simgrid::s4u::Link::on_creation_cb([](simgrid::s4u::Link& link) {
if (link.get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI) {
XBT_DEBUG("Wired Link created: %s", link.get_cname());
link.extension_set(new LinkEnergy(&link));
}
});
- simgrid::s4u::Link::on_state_change.connect([](simgrid::s4u::Link const& link) {
+ simgrid::s4u::Link::on_onoff_cb([](simgrid::s4u::Link const& link) {
if (link.get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI)
link.extension<LinkEnergy>()->update();
});
- simgrid::s4u::Link::on_destruction.connect([](simgrid::s4u::Link const& link) {
+ simgrid::s4u::Link::on_destruction_cb([](simgrid::s4u::Link const& link) {
if (link.get_name() != "__loopback__" && link.get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI)
XBT_INFO("Energy consumption of link '%s': %f Joules", link.get_cname(),
link.extension<LinkEnergy>()->get_consumed_energy());
});
- 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);
- simgrid::s4u::Engine::on_simulation_end.connect(&on_simulation_end);
+ simgrid::s4u::Engine::on_simulation_end_cb(&on_simulation_end);
}
/** @ingroup plugin_link_energy