Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
cosmetics
[simgrid.git] / src / plugins / link_energy.cpp
index 3a81581..97aeb01 100644 (file)
@@ -1,11 +1,13 @@
-/* Copyright (c) 2017-2019. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2017-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. */
 
 #include "simgrid/Exception.hpp"
+#include "simgrid/host.h"
 #include "simgrid/plugins/energy.h"
 #include "simgrid/s4u/Engine.hpp"
+#include "simgrid/simix.hpp"
 #include "src/surf/network_interface.hpp"
 #include "src/surf/surf_interface.hpp"
 #include "surf/surf.hpp"
@@ -15,7 +17,7 @@
 
 SIMGRID_REGISTER_PLUGIN(link_energy, "Link energy consumption.", &sg_link_energy_plugin_init)
 
-/** @defgroup plugin_link_energy
+/** @defgroup plugin_link_energy Plugin Link Energy
 
  This is the link energy plugin, accounting for the dissipated energy in the simulated platform.
 
@@ -34,8 +36,7 @@ SIMGRID_REGISTER_PLUGIN(link_energy, "Link energy consumption.", &sg_link_energy
  The second property means that when your host is turned off, it will dissipate only 10 Watts (please note that these
  values are arbitrary).
 
- To simulate the energy-related elements, first call the simgrid#energy#sg_link_energy_plugin_init() before your
- #MSG_init(),
+ To simulate the energy-related elements, first call the sg_link_energy_plugin_init() before loading the platform
  and then use the following function to retrieve the consumption of a given link: sg_link_get_consumed_energy().
  */
 
@@ -45,20 +46,7 @@ namespace simgrid {
 namespace plugin {
 
 class LinkEnergy {
-public:
-  static simgrid::xbt::Extension<simgrid::s4u::Link, LinkEnergy> EXTENSION_ID;
-
-  explicit LinkEnergy(simgrid::s4u::Link* ptr) : link_(ptr), last_updated_(surf_get_clock()) {}
-  ~LinkEnergy() = default;
-
-  void init_watts_range_list();
-  double get_consumed_energy();
-  void update();
-
-private:
-  double get_power();
-
-  simgrid::s4u::Link* link_{};
+  s4u::Link* link_{};
 
   bool inited_{false};
   double idle_{0.0};
@@ -66,9 +54,20 @@ private:
 
   double total_energy_{0.0};
   double last_updated_{0.0}; /*< Timestamp of the last energy update event*/
+
+  double get_power() const;
+
+public:
+  static xbt::Extension<simgrid::s4u::Link, LinkEnergy> EXTENSION_ID;
+
+  explicit LinkEnergy(s4u::Link* ptr) : link_(ptr), last_updated_(surf_get_clock()) {}
+
+  void init_watts_range_list();
+  double get_consumed_energy();
+  void update();
 };
 
-simgrid::xbt::Extension<simgrid::s4u::Link, LinkEnergy> LinkEnergy::EXTENSION_ID;
+xbt::Extension<s4u::Link, LinkEnergy> LinkEnergy::EXTENSION_ID;
 
 void LinkEnergy::update()
 {
@@ -124,9 +123,8 @@ void LinkEnergy::init_watts_range_list()
   }
 }
 
-double LinkEnergy::get_power()
+double LinkEnergy::get_power() const
 {
-
   if (!inited_)
     return 0.0;
 
@@ -141,7 +139,7 @@ double LinkEnergy::get_power()
 double LinkEnergy::get_consumed_energy()
 {
   if (last_updated_ < surf_get_clock()) // We need to simcall this as it modifies the environment
-    simgrid::kernel::actor::simcall(std::bind(&LinkEnergy::update, this));
+    kernel::actor::simcall(std::bind(&LinkEnergy::update, this));
   return this->total_energy_;
 }
 } // namespace plugin
@@ -150,17 +148,15 @@ double LinkEnergy::get_consumed_energy()
 using simgrid::plugin::LinkEnergy;
 
 /* **************************** events  callback *************************** */
-static void on_communicate(simgrid::kernel::resource::NetworkAction const& action, simgrid::s4u::Host*,
-                           simgrid::s4u::Host*)
+static void on_communicate(const simgrid::kernel::resource::NetworkAction& action)
 {
   XBT_DEBUG("onCommunicate is called");
-  for (simgrid::kernel::resource::LinkImpl* link : action.links()) {
-
-    if (link == nullptr)
+  for (auto const* link : action.get_links()) {
+    if (link == nullptr || link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI)
       continue;
 
     XBT_DEBUG("Update link %s", link->get_cname());
-    LinkEnergy* link_energy = link->get_iface()->extension<LinkEnergy>();
+    auto* link_energy = link->get_iface()->extension<LinkEnergy>();
     link_energy->init_watts_range_list();
     link_energy->update();
   }
@@ -171,7 +167,10 @@ static void on_simulation_end()
   std::vector<simgrid::s4u::Link*> links = simgrid::s4u::Engine::get_instance()->get_all_links();
 
   double total_energy = 0.0; // Total dissipated energy (whole platform)
-  for (const auto link : links) {
+  for (auto const* link : links) {
+    if (link == nullptr || link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI)
+      continue;
+
     double link_energy = link->extension<LinkEnergy>()->get_consumed_energy();
     total_energy += link_energy;
   }
@@ -187,7 +186,7 @@ int sg_link_energy_is_inited()
 /** @ingroup plugin_link_energy
  * @brief Enable energy plugin
  * @details Enable energy plugin to get joules consumption of each cpu. You should call this function before
- * #MSG_init().
+ * loading your platform.
  */
 void sg_link_energy_plugin_init()
 {
@@ -197,24 +196,34 @@ void sg_link_energy_plugin_init()
 
   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) { link.extension_set(new LinkEnergy(&link)); });
+  simgrid::s4u::Link::on_creation.connect([](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));
+    } else {
+      XBT_DEBUG("Not Wired link: %s", link.get_cname());
+    }
+  });
 
-  simgrid::s4u::Link::on_state_change.connect(
-      [](simgrid::s4u::Link const& link) { link.extension<LinkEnergy>()->update(); });
+  simgrid::s4u::Link::on_state_change.connect([](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) {
-    if (link.get_name() != "__loopback__")
+    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::s4u::Link::on_communication_state_change.connect([](
-      simgrid::kernel::resource::NetworkAction const& action, simgrid::kernel::resource::Action::State /* previous */) {
-    for (simgrid::kernel::resource::LinkImpl* link : action.links()) {
-      if (link != nullptr)
-        link->get_iface()->extension<LinkEnergy>()->update();
-    }
-  });
+  simgrid::s4u::Link::on_communication_state_change.connect(
+      [](simgrid::kernel::resource::NetworkAction const& action,
+         simgrid::kernel::resource::Action::State /* previous */) {
+        for (auto const* link : action.get_links()) {
+          if (link != nullptr && link->get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI)
+            link->get_iface()->extension<LinkEnergy>()->update();
+        }
+      });
 
   simgrid::s4u::Link::on_communicate.connect(&on_communicate);
   simgrid::s4u::Engine::on_simulation_end.connect(&on_simulation_end);
@@ -227,7 +236,7 @@ void sg_link_energy_plugin_init()
  *  The result is that the actor requesting this value will be interrupted,
  *  the value will be updated in kernel mode before returning the control to the requesting actor.
  */
-double sg_link_get_consumed_energy(sg_link_t link)
+double sg_link_get_consumed_energy(const_sg_link_t link)
 {
   if (not LinkEnergy::EXTENSION_ID.valid())
     throw simgrid::xbt::InitializationError("The Energy plugin is not active. Please call sg_link_energy_plugin_init() "