Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
more objects
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 8 Sep 2016 15:31:29 +0000 (17:31 +0200)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 8 Sep 2016 15:31:29 +0000 (17:31 +0200)
include/simgrid/jedule/jedule_events.hpp
include/simgrid/jedule/jedule_platform.hpp
src/instr/jedule/jedule_events.cpp
src/instr/jedule/jedule_platform.cpp

index 757e720..0cf00db 100644 (file)
@@ -21,8 +21,7 @@ namespace jedule{
 
 XBT_PUBLIC_CLASS Event{
   public:
-    Event(std::string name, double start_time, double end_time, std::string type)
-      : name(name), start_time(start_time), end_time(end_time), type(type){}
+    Event(std::string name, double start_time, double end_time, std::string type);
     ~Event();
     void addCharacteristic(char *characteristic);
     void addResources(std::vector<sg_host_t> *host_selection);
@@ -34,7 +33,7 @@ XBT_PUBLIC_CLASS Event{
     double start_time;
     double end_time;
     std::string type;
-    std::vector<jed_res_subset_t> resource_subsets;
+    std::vector<jed_subset_t> *resource_subsets;
     std::vector<char*> characteristics_list; /* just a list of names (strings) */
     std::unordered_map<char*, char*> info_map;     /* key/value pairs */
 };
index 3efd11c..6c0055e 100644 (file)
@@ -13,7 +13,6 @@
 #include <unordered_map>
 #include <vector>
 #include <string>
-
 #if HAVE_JEDULE
 
 namespace simgrid {
@@ -27,7 +26,7 @@ private:
   int is_lowest = 0;
 public:
   std::string name;
-  std::unordered_map<const char*, int> name2id;
+  std::unordered_map<const char*, unsigned int> name2id;
   Container *parent = nullptr;
   std::vector<Container*> children;
   std::vector<sg_host_t> resource_list;
@@ -40,38 +39,21 @@ public:
   void printResources(FILE *file);
 };
 
-}
-}
-SG_BEGIN_DECL()
-typedef simgrid::jedule::Container * jed_container_t;
-
-/* FIXME: jedule_container should be objectified too */
-/** selection of a subset of resources from the original set */
-struct jed_res_subset {
-  jed_container_t parent;
+XBT_PUBLIC_CLASS Subset {
+public:
+  Subset(int s, int n, Container* p);
+  virtual ~Subset()=default;
   int start_idx; // start idx in resource_list of container
   int nres;      // number of resources spanning starting at start_idx
+  Container *parent;
 };
 
-typedef struct jed_res_subset s_jed_res_subset_t, *jed_res_subset_t;
-
-/**
- * it is assumed that the host_names in the entire system are unique that means that we don't need parent references
- *
- * subset_list must be allocated
- * host_names is the list of host_names associated with an event
- */
-void jed_simgrid_get_resource_selection_by_hosts(xbt_dynar_t subset_list, std::vector<sg_host_t>* host_list);
-
-/*
-  global:
-      hash host_id -> container
-  container:
-      hash host_id -> jed_host_id
-      list <- [ jed_host_ids ]
-      list <- sort( list )
-      list_chunks <- chunk( list )   -> [ 1, 3-5, 7-9 ]
-*/
+}
+}
+SG_BEGIN_DECL()
+typedef simgrid::jedule::Container * jed_container_t;
+typedef simgrid::jedule::Subset * jed_subset_t;
+void get_resource_selection_by_hosts(std::vector<jed_subset_t>* subset_list, std::vector<sg_host_t> *host_list);
 
 SG_END_DECL()
 
index 5d4c949..b7ff520 100644 (file)
@@ -5,7 +5,9 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "simgrid/jedule/jedule_events.hpp"
+#include "simgrid/jedule/jedule_platform.hpp"
 #include "simgrid/jedule/jedule.hpp"
+#include "simgrid/s4u/As.hpp"
 
 #include "xbt/asserts.h"
 
 namespace simgrid{
 namespace jedule{
 
-Event::~Event(){
-  while (!this->resource_subsets.empty()){
-    xbt_free(this->resource_subsets.back());
-    this->resource_subsets.pop_back();
-  }
+Event::Event(std::string name, double start_time, double end_time, std::string type)
+  : name(name), start_time(start_time), end_time(end_time), type(type)
+{
+  this->resource_subsets = new std::vector<jed_subset_t>();
 }
 
-void Event::addResources(std::vector<sg_host_t> *host_selection) {
-  xbt_dynar_t resource_subset_list;
-  jed_res_subset_t res_set;
-  unsigned int i;
-
-  resource_subset_list = xbt_dynar_new(sizeof(jed_res_subset_t), nullptr);
-
-  jed_simgrid_get_resource_selection_by_hosts(resource_subset_list, host_selection);
-  xbt_dynar_foreach(resource_subset_list, i, res_set)  {
-    this->resource_subsets.push_back(res_set);
+Event::~Event()
+{
+  if (!this->resource_subsets->empty()){
+    for (auto subset: *this->resource_subsets)
+      delete subset;
+    delete this->resource_subsets;
   }
+}
 
-  xbt_dynar_free_container(&resource_subset_list);
+void Event::addResources(std::vector<sg_host_t> *host_selection)
+{
+  get_resource_selection_by_hosts(this->resource_subsets, host_selection);
 }
 
-void Event::addCharacteristic(char *characteristic) {
+void Event::addCharacteristic(char *characteristic)
+{
   xbt_assert( characteristic != nullptr );
   this->characteristics_list.push_back(characteristic);
 }
@@ -45,19 +46,20 @@ void Event::addInfo(char* key, char *value) {
   this->info_map.insert({key, value});
 }
 
-void Event::print(FILE *jed_file){
+void Event::print(FILE *jed_file)
+{
   fprintf(jed_file, "    <event>\n");
   fprintf(jed_file, "      <prop key=\"name\" value=\"%s\" />\n", this->name.c_str());
   fprintf(jed_file, "      <prop key=\"start\" value=\"%g\" />\n", this->start_time);
   fprintf(jed_file, "      <prop key=\"end\" value=\"%g\" />\n", this->end_time);
   fprintf(jed_file, "      <prop key=\"type\" value=\"%s\" />\n", this->type.c_str());
 
-  xbt_assert(!this->resource_subsets.empty());
+  xbt_assert(!this->resource_subsets->  empty());
   fprintf(jed_file, "      <res_util>\n");
-  for (auto subset: this->resource_subsets) {
+  for (auto subset: *this->resource_subsets) {
     fprintf(jed_file, "        <select resources=\"");
     fprintf(jed_file, "%s", subset->parent->getHierarchyAsString().c_str());
-    fprintf(jed_file, ".[%d-%d]", subset->start_idx, subset->start_idx + subset->nres - 1);
+    fprintf(jed_file, ".[%d-%d]", subset->start_idx, subset->start_idx + subset->nres-1);
     fprintf(jed_file, "\" />\n");
   }
   fprintf(jed_file, "      </res_util>\n");
index 060dbe0..45c558f 100644 (file)
 
 #include "xbt/asserts.h"
 #include "xbt/dynar.h"
+#include <algorithm>
 
 #if HAVE_JEDULE
 
 namespace simgrid {
 namespace jedule {
+Subset::Subset(int start_idx, int end_idx, Container* parent)
+: start_idx(start_idx), parent(parent)
+{
+  nres=end_idx-start_idx+1;
+}
+
 
-Container::Container(std::string name)
-: name(name) {
+Container::Container(std::string name): name(name)
+{
   container_name2container.insert({this->name, this});
 }
 
-Container::~Container(){
+Container::~Container()
+{
   if(!this->children.empty())
     for (auto child: this->children)
       delete child;
 }
 
-void Container::addChild(jed_container_t child){
+void Container::addChild(jed_container_t child)
+{
   xbt_assert(this != nullptr);
   xbt_assert(child != nullptr);
   this->children.push_back(child);
   child->parent = this;
 }
 
-void Container::addResources(std::vector<sg_host_t> hosts){
+void Container::addResources(std::vector<sg_host_t> hosts)
+{
   this->is_lowest = 1;
   this->children.clear();
   this->last_id = 0;
@@ -50,7 +60,8 @@ void Container::addResources(std::vector<sg_host_t> hosts){
   }
 }
 
-void Container::createHierarchy(AS_t from_as){
+void Container::createHierarchy(AS_t from_as)
+{
   xbt_dict_cursor_t cursor = nullptr;
   char *key;
   AS_t elem;
@@ -79,7 +90,8 @@ void Container::createHierarchy(AS_t from_as){
   }
 }
 
-std::vector<int> Container::getHierarchy() {
+std::vector<int> Container::getHierarchy()
+{
   xbt_assert( this!= nullptr );
 
   if(this->parent != nullptr ) {
@@ -111,7 +123,8 @@ std::vector<int> Container::getHierarchy() {
   }
 }
 
-std::string Container::getHierarchyAsString(){
+std::string Container::getHierarchyAsString()
+{
   std::string output("");
 
   std::vector<int> heir_list = this->getHierarchy();
@@ -128,7 +141,8 @@ std::string Container::getHierarchyAsString(){
   return output;
 }
 
-void Container::printResources(FILE * jed_file){
+void Container::printResources(FILE * jed_file)
+{
   unsigned int i=0;
   xbt_assert(!this->resource_list.empty());
 
@@ -147,7 +161,8 @@ void Container::printResources(FILE * jed_file){
   fprintf(jed_file, "\" />\n");
 }
 
-void Container::print(FILE* jed_file) {
+void Container::print(FILE* jed_file)
+{
   xbt_assert( this != nullptr );
   fprintf(jed_file, "    <res name=\"%s\">\n", this->name.c_str());
   if( !this->children.empty()){
@@ -163,73 +178,50 @@ void Container::print(FILE* jed_file) {
 }
 }
 
-static int compare_ids(const void *num1, const void *num2) {
-  return *((int*) num1) - *((int*) num2);
-}
-
-static void add_subset_to(xbt_dynar_t subset_list, int start, int end, jed_container_t parent) {
-  jed_res_subset_t subset;
-
-  xbt_assert( subset_list != nullptr );
-  xbt_assert( parent != nullptr );
-
-  subset = xbt_new0(s_jed_res_subset_t,1);
-  subset->start_idx = start;
-  subset->nres      = end-start+1;
-  subset->parent    = parent;
-
-  xbt_dynar_push(subset_list, &subset);
-}
-
-static void add_subsets_to(xbt_dynar_t subset_list, std::vector<const char*> hostgroup, jed_container_t parent) {
-  int id;
-
+static void add_subsets_to(std::vector<jed_subset_t> *subset_list, std::vector<const char*> hostgroup, jed_container_t parent)
+{
   // get ids for each host
   // sort ids
   // compact ids
   // create subset for each id group
 
-  xbt_assert( subset_list != nullptr );
   xbt_assert( parent != nullptr );
 
-  xbt_dynar_t id_list = xbt_dynar_new(sizeof(int), nullptr);
+  std::vector<unsigned int> id_list;
 
   for (auto host_name : hostgroup) {
     xbt_assert( host_name != nullptr );
     jed_container_t parent = host2_simgrid_parent_container.at(host_name);
-    id = parent->name2id.at(host_name);
-    xbt_dynar_push(id_list, &id);
+    unsigned int id = parent->name2id.at(host_name);
+    id_list.push_back(id);
   }
-  int nb_ids = xbt_dynar_length(id_list);
-  xbt_dynar_sort(id_list, &compare_ids);
-
-  int *id_ar = static_cast<int*>(xbt_dynar_to_array(id_list));
+  unsigned int nb_ids = id_list.size();
+  std::sort(id_list.begin(), id_list.end());
 
   if( nb_ids > 0 ) {
     int start = 0;
-
     int pos = start;
-    for(int i=0; i<nb_ids; i++) {
-      if( id_ar[i] - id_ar[pos] > 1 ) {
-        add_subset_to( subset_list, id_ar[start], id_ar[pos], parent );
+    for(unsigned int i=0; i<nb_ids; i++) {
+      if( id_list[i] - id_list[pos] > 1 ) {
+        subset_list->push_back(new simgrid::jedule::Subset(id_list[start], id_list[pos], parent));
         start = i;
 
         if( i == nb_ids-1 ) {
-          add_subset_to( subset_list, id_ar[i], id_ar[i], parent );
+         subset_list->push_back(new simgrid::jedule::Subset(id_list[i], id_list[i], parent));
         }
       } else {
         if( i == nb_ids-1 ) {
-          add_subset_to( subset_list, id_ar[start], id_ar[i], parent );
+          subset_list->push_back(new simgrid::jedule::Subset(id_list[start], id_list[i], parent));
         }
       }
       pos = i;
     }
   }
 
-  xbt_free(id_ar);
 }
 
-void jed_simgrid_get_resource_selection_by_hosts(xbt_dynar_t subset_list, std::vector<sg_host_t> *host_list) {
+void get_resource_selection_by_hosts(std::vector<jed_subset_t> *subset_list, std::vector<sg_host_t> *host_list)
+{
   xbt_assert( host_list != nullptr );
   // for each host name
   //  find parent container