Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add the Storage::read_async and Storage::write_async methods
[simgrid.git] / src / plugins / link_energy.cpp
index 17aa277..8bf1697 100644 (file)
@@ -6,11 +6,14 @@
 #include "simgrid/plugins/energy.h"
 #include "simgrid/s4u/Engine.hpp"
 #include "src/surf/network_interface.hpp"
+#include "src/surf/surf_interface.hpp"
 #include "surf/surf.hpp"
 
 #include <boost/algorithm/string/classification.hpp>
 #include <boost/algorithm/string/split.hpp>
 
+SIMGRID_REGISTER_PLUGIN(link_energy, "Link energy consumption.", &sg_link_energy_plugin_init)
+
 /** @addtogroup SURF_plugin_energy
 
 
  The energy consumption of a link depends directly on its current traffic load. Specify that consumption in your
  platform file as follows:
 
\verbatim
@verbatim
  <link id="SWITCH1" bandwidth="125Mbps" latency="5us" sharing_policy="SHARED" >
  <prop id="watt_range" value="100.0:200.0" />
  <prop id="watt_off" value="10" />
  </link>
\endverbatim
@endverbatim
 
  The first property means that when your link is switched on, but without anything to do, it will dissipate 100 Watts.
  If it's fully loaded, it will dissipate 200 Watts. If its load is at 50%, then it will dissipate 150 Watts.
@@ -45,15 +48,15 @@ class LinkEnergy {
 public:
   static simgrid::xbt::Extension<simgrid::s4u::Link, LinkEnergy> EXTENSION_ID;
 
-  explicit LinkEnergy(simgrid::s4u::Link* ptr);
-  ~LinkEnergy();
+  explicit LinkEnergy(simgrid::s4u::Link* ptr) : link_(ptr), last_updated_(surf_get_clock()) {}
+  ~LinkEnergy() = default;
 
-  void initWattsRangeList();
-  double getConsumedEnergy();
+  void init_watts_range_list();
+  double get_consumed_energy();
   void update();
 
 private:
-  double getPower();
+  double get_power();
 
   simgrid::s4u::Link* link_{};
 
@@ -61,25 +64,21 @@ private:
   double idle_{0.0};
   double busy_{0.0};
 
-  double totalEnergy_{0.0};
-  double lastUpdated_{0.0}; /*< Timestamp of the last energy update event*/
+  double total_energy_{0.0};
+  double last_updated_{0.0}; /*< Timestamp of the last energy update event*/
 };
 
 simgrid::xbt::Extension<simgrid::s4u::Link, LinkEnergy> LinkEnergy::EXTENSION_ID;
 
-LinkEnergy::LinkEnergy(simgrid::s4u::Link* ptr) : link_(ptr), lastUpdated_(surf_get_clock()) {}
-
-LinkEnergy::~LinkEnergy() = default;
-
 void LinkEnergy::update()
 {
-  double power = getPower();
+  double power = get_power();
   double now   = surf_get_clock();
-  totalEnergy_ += power * (now - lastUpdated_);
-  lastUpdated_ = now;
+  total_energy_ += power * (now - last_updated_);
+  last_updated_ = now;
 }
 
-void LinkEnergy::initWattsRangeList()
+void LinkEnergy::init_watts_range_list()
 {
 
   if (inited_)
@@ -104,19 +103,23 @@ void LinkEnergy::initWattsRangeList()
 
     /* min_power corresponds to the idle power (link load = 0) */
     /* max_power is the power consumed at 100% link load       */
-    char* idleMsg = bprintf("Invalid idle power value for link%s", this->link_->get_cname());
-    char* busyMsg = bprintf("Invalid busy power value for %s", this->link_->get_cname());
+    try {
+      idle_ = std::stod(current_power_values.front());
+    } catch (std::invalid_argument& ia) {
+      throw std::invalid_argument(std::string("Invalid idle power value for link ") + this->link_->get_cname());
+    }
 
-    idle_ = xbt_str_parse_double((current_power_values.at(0)).c_str(), idleMsg);
-    busy_ = xbt_str_parse_double((current_power_values.at(1)).c_str(), busyMsg);
+    try {
+      busy_ = std::stod(current_power_values.back());
+    } catch (std::invalid_argument& ia) {
+      throw std::invalid_argument(std::string("Invalid busy power value for link ") + this->link_->get_cname());
+    }
 
-    xbt_free(idleMsg);
-    xbt_free(busyMsg);
     update();
   }
 }
 
-double LinkEnergy::getPower()
+double LinkEnergy::get_power()
 {
 
   if (!inited_)
@@ -130,11 +133,11 @@ double LinkEnergy::getPower()
   return idle_ + dynamic_power;
 }
 
-double LinkEnergy::getConsumedEnergy()
+double LinkEnergy::get_consumed_energy()
 {
-  if (lastUpdated_ < surf_get_clock()) // We need to simcall this as it modifies the environment
+  if (last_updated_ < surf_get_clock()) // We need to simcall this as it modifies the environment
     simgrid::simix::simcall(std::bind(&LinkEnergy::update, this));
-  return this->totalEnergy_;
+  return this->total_energy_;
 }
 } // namespace plugin
 } // namespace simgrid
@@ -142,8 +145,7 @@ double LinkEnergy::getConsumedEnergy()
 using simgrid::plugin::LinkEnergy;
 
 /* **************************** events  callback *************************** */
-static void onCommunicate(simgrid::kernel::resource::NetworkAction* action, simgrid::s4u::Host* src,
-                          simgrid::s4u::Host* dst)
+static void on_communicate(simgrid::kernel::resource::NetworkAction* action, simgrid::s4u::Host*, simgrid::s4u::Host*)
 {
   XBT_DEBUG("onCommunicate is called");
   for (simgrid::kernel::resource::LinkImpl* link : action->links()) {
@@ -153,18 +155,18 @@ static void onCommunicate(simgrid::kernel::resource::NetworkAction* action, simg
 
     XBT_DEBUG("Update link %s", link->get_cname());
     LinkEnergy* link_energy = link->piface_.extension<LinkEnergy>();
-    link_energy->initWattsRangeList();
+    link_energy->init_watts_range_list();
     link_energy->update();
   }
 }
 
-static void onSimulationEnd()
+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) {
-    double link_energy = link->extension<LinkEnergy>()->getConsumedEnergy();
+    double link_energy = link->extension<LinkEnergy>()->get_consumed_energy();
     total_energy += link_energy;
   }
 
@@ -176,9 +178,9 @@ int sg_link_energy_is_inited()
 {
   return LinkEnergy::EXTENSION_ID.valid();
 }
-/** \ingroup SURF_plugin_energy
- * \brief Enable energy plugin
- * \details Enable energy plugin to get joules consumption of each cpu. You should call this function before
+/** @ingroup SURF_plugin_energy
+ * @brief Enable energy plugin
+ * @details Enable energy plugin to get joules consumption of each cpu. You should call this function before
  * #MSG_init().
  */
 void sg_link_energy_plugin_init()
@@ -197,18 +199,19 @@ void sg_link_energy_plugin_init()
   simgrid::s4u::Link::on_destruction.connect([](simgrid::s4u::Link& link) {
     if (strcmp(link.get_cname(), "__loopback__"))
       XBT_INFO("Energy consumption of link '%s': %f Joules", link.get_cname(),
-               link.extension<LinkEnergy>()->getConsumedEnergy());
+               link.extension<LinkEnergy>()->get_consumed_energy());
   });
 
-  simgrid::s4u::Link::on_communication_state_change.connect([](simgrid::kernel::resource::NetworkAction* action) {
-    for (simgrid::kernel::resource::LinkImpl* link : action->links()) {
-      if (link != nullptr)
-        link->piface_.extension<LinkEnergy>()->update();
-    }
-  });
+  simgrid::s4u::Link::on_communication_state_change.connect(
+      [](simgrid::kernel::resource::NetworkAction* action, simgrid::kernel::resource::Action::State /* previous */) {
+        for (simgrid::kernel::resource::LinkImpl* link : action->links()) {
+          if (link != nullptr)
+            link->piface_.extension<LinkEnergy>()->update();
+        }
+      });
 
-  simgrid::s4u::Link::on_communicate.connect(&onCommunicate);
-  simgrid::s4u::on_simulation_end.connect(&onSimulationEnd);
+  simgrid::s4u::Link::on_communicate.connect(&on_communicate);
+  simgrid::s4u::on_simulation_end.connect(&on_simulation_end);
 }
 
 /** @ingroup plugin_energy
@@ -220,5 +223,5 @@ void sg_link_energy_plugin_init()
  */
 double sg_link_get_consumed_energy(sg_link_t link)
 {
-  return link->extension<LinkEnergy>()->getConsumedEnergy();
+  return link->extension<LinkEnergy>()->get_consumed_energy();
 }