Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
One more dynar less.
[simgrid.git] / src / simdag / sd_dotloader.cpp
index 4979a2e..9f999f7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2018. The SimGrid Team.
+/* Copyright (c) 2009-2019. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -9,14 +9,16 @@
 #include "simgrid/simdag.h"
 #include "src/internal_config.h"
 #include "xbt/file.hpp"
+#include <algorithm>
 #include <cstring>
 #include <unordered_map>
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files");
+#include <vector>
 
 #if HAVE_GRAPHVIZ
 #include <graphviz/cgraph.h>
 
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files");
+
 xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool schedule);
 
 static void dot_task_p_free(void *task) {
@@ -43,23 +45,12 @@ xbt_dynar_t SD_dotload_with_sched(const char *filename) {
   return SD_dotload_generic(filename, true, true);
 }
 
-static int edge_compare(const void *a, const void *b)
-{
-  unsigned va = AGSEQ(*(Agedge_t **)a);
-  unsigned vb = AGSEQ(*(Agedge_t **)b);
-  if (va == vb)
-    return 0;
-  else
-    return (va < vb ? -1 : 1);
-}
-
 xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool schedule)
 {
   xbt_assert(filename, "Unable to use a null file descriptor\n");
   FILE *in_file = fopen(filename, "r");
   xbt_assert(in_file != nullptr, "Failed to open file: %s", filename);
 
-  unsigned int i;
   SD_task_t root;
   SD_task_t end;
   SD_task_t task;
@@ -152,17 +143,16 @@ xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool sched
     end = jobs.at("end");
 
   /* Create edges */
-  xbt_dynar_t edges = xbt_dynar_new(sizeof(Agedge_t*), nullptr);
+  std::vector<Agedge_t*> edges;
   for (node = agfstnode(dag_dot); node; node = agnxtnode(dag_dot, node)) {
-    Agedge_t * edge;
-    xbt_dynar_reset(edges);
-    for (edge = agfstout(dag_dot, node); edge; edge = agnxtout(dag_dot, edge))
-      xbt_dynar_push_as(edges, Agedge_t *, edge);
+    edges.clear();
+    for (Agedge_t* edge = agfstout(dag_dot, node); edge; edge = agnxtout(dag_dot, edge))
+      edges.push_back(edge);
 
     /* Be sure edges are sorted */
-    xbt_dynar_sort(edges, edge_compare);
+    std::sort(edges.begin(), edges.end(), [](const Agedge_t* a, const Agedge_t* b) { return AGSEQ(a) < AGSEQ(b); });
 
-    xbt_dynar_foreach(edges, i, edge) {
+    for (Agedge_t* edge : edges) {
       char *src_name=agnameof(agtail(edge));
       char *dst_name=agnameof(aghead(edge));
       double size = atof(agget(edge, (char *) "size"));
@@ -190,12 +180,12 @@ xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool sched
       }
     }
   }
-  xbt_dynar_free(&edges);
 
   XBT_DEBUG("All tasks have been created, put %s at the end of the dynar", end->name);
   xbt_dynar_push(result, &end);
 
   /* Connect entry tasks to 'root', and exit tasks to 'end'*/
+  unsigned i;
   xbt_dynar_foreach (result, i, task){
     if (task->predecessors->empty() && task->inputs->empty() && task != root) {
       XBT_DEBUG("Task '%s' has no source. Add dependency from 'root'", task->name);
@@ -213,19 +203,18 @@ xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool sched
 
   if(schedule){
     if (schedule_success) {
-      std::vector<simgrid::s4u::Host*> hosts;
-      simgrid::s4u::Engine::getInstance()->getHostList(&hosts);
+      std::vector<simgrid::s4u::Host*> hosts = simgrid::s4u::Engine::get_instance()->get_all_hosts();
 
       for (auto const& elm : computers) {
         SD_task_t previous_task = nullptr;
-        for (auto const& task : *elm.second) {
+        for (auto const& cur_task : *elm.second) {
           /* add dependency between the previous and the task to avoid parallel execution */
-          if(task){
-            if (previous_task && not SD_task_dependency_exists(previous_task, task))
-              SD_task_dependency_add(previous_task, task);
+          if (cur_task) {
+            if (previous_task && not SD_task_dependency_exists(previous_task, cur_task))
+              SD_task_dependency_add(previous_task, cur_task);
 
-            SD_task_schedulel(task, 1, hosts[atoi(elm.first.c_str())]);
-            previous_task = task;
+            SD_task_schedulel(cur_task, 1, hosts[std::stod(elm.first)]);
+            previous_task = cur_task;
           }
         }
         delete elm.second;
@@ -240,7 +229,7 @@ xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool sched
   }
 
   if (result && not acyclic_graph_detail(result)) {
-    std::string base = simgrid::xbt::Path(filename).getBasename();
+    std::string base = simgrid::xbt::Path(filename).get_base_name();
     XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.", base.c_str());
     xbt_dynar_free(&result);
     result = nullptr;