Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
attempt to replace internal dynar by std::vector
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Wed, 6 Jul 2016 13:02:16 +0000 (15:02 +0200)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Wed, 6 Jul 2016 13:02:16 +0000 (15:02 +0200)
src/simdag/sd_daxloader.cpp
src/simdag/sd_global.cpp
src/simdag/sd_task.cpp
src/simdag/simdag_private.h

index 77f1532..dc9eb44 100644 (file)
@@ -340,7 +340,7 @@ void STag_dax__uses(void)
   SD_task_t file = static_cast<SD_task_t>(xbt_dict_get_or_null(files, A_dax__uses_file));
   if (file == nullptr) {
     file = SD_task_create_comm_e2e(A_dax__uses_file, nullptr, size);
-    xbt_dynar_pop(sd_global->initial_task_set,nullptr);
+    sd_global->initial_task_set->pop_back();
     xbt_dict_set(files, A_dax__uses_file, file, nullptr);
   } else {
     if (SD_task_get_amount(file) != size) {
index fa37ca6..0a88d5c 100644 (file)
@@ -40,9 +40,9 @@ void SD_init(int *argc, char **argv)
 
   sd_global->task_mallocator=xbt_mallocator_new(65536, SD_task_new_f, SD_task_free_f, SD_task_recycle_f);
 
-  sd_global->initial_task_set = xbt_dynar_new(sizeof(SD_task_t), nullptr);
-  sd_global->executable_task_set = xbt_dynar_new(sizeof(SD_task_t), nullptr);
-  sd_global->completed_task_set = xbt_dynar_new(sizeof(SD_task_t), nullptr);
+  sd_global->initial_task_set = new std::vector<SD_task_t>();
+  sd_global->executable_task_set = new std::vector<SD_task_t>();
+  sd_global->completed_task_set = new std::vector<SD_task_t>();
   sd_global->return_set = xbt_dynar_new(sizeof(SD_task_t), nullptr);
 
   surf_init(argc, argv);
@@ -129,7 +129,8 @@ xbt_dynar_t SD_simulate(double how_long) {
   xbt_dynar_reset(sd_global->return_set);
 
   /* explore the runnable tasks */
-  xbt_dynar_foreach(sd_global->executable_task_set , iter, task) {
+  for (unsigned int i =0; i < sd_global->executable_task_set->size(); i++) {
+    task = sd_global->executable_task_set->at(i);
     XBT_VERB("Executing task '%s'", SD_task_get_name(task));
     SD_task_run(task);
     xbt_dynar_push(sd_global->return_set, &task);
@@ -228,13 +229,13 @@ xbt_dynar_t SD_simulate(double how_long) {
     }
   }
 
-  if (!sd_global->watch_point_reached && how_long<0 &&
-      xbt_dynar_is_empty(sd_global->initial_task_set) == 0) {
+  if (!sd_global->watch_point_reached && how_long<0 && !sd_global->initial_task_set->empty()) {
     XBT_WARN("Simulation is finished but %lu tasks are still not done",
-             xbt_dynar_length(sd_global->initial_task_set));
+             sd_global->initial_task_set->size());
     static const char* state_names[] =
       { "SD_NOT_SCHEDULED", "SD_SCHEDULABLE", "SD_SCHEDULED", "SD_RUNNABLE", "SD_RUNNING", "SD_DONE","SD_FAILED" };
-    xbt_dynar_foreach(sd_global->initial_task_set, iter, task){
+    for (unsigned int i=0; i< sd_global->initial_task_set->size() ; i++){
+      task = sd_global->initial_task_set->at(i);
       XBT_WARN("%s is in %s state", SD_task_get_name(task), state_names[SD_task_get_state(task)]);
     }
   }
@@ -268,9 +269,9 @@ void SD_exit()
 #endif
 
   xbt_mallocator_free(sd_global->task_mallocator);
-  xbt_dynar_free_container(&(sd_global->initial_task_set));
-  xbt_dynar_free_container(&(sd_global->executable_task_set));
-  xbt_dynar_free_container(&(sd_global->completed_task_set));
+  delete sd_global->initial_task_set;
+  delete sd_global->executable_task_set;
+  delete sd_global->completed_task_set;
   xbt_dynar_free_container(&(sd_global->return_set));
   xbt_free(sd_global);
   sd_global = nullptr;
index d09c692..28df855 100644 (file)
@@ -22,7 +22,7 @@ static void __SD_task_dependency_destroy(void *dependency)
 /* Remove all dependencies associated with a task. This function is called when the task is destroyed. */
 static void __SD_task_remove_dependencies(SD_task_t task)
 {
-  /* we must destroy the dependencies carefuly (with SD_dependency_remove) because each one is stored twice */
+  /* we must destroy the dependencies carefully (with SD_dependency_remove) because each one is stored twice */
   SD_dependency_t dependency;
   while (xbt_dynar_is_empty(task->tasks_before) == 0) {
     xbt_dynar_get_cpy(task->tasks_before, 0, &dependency);
@@ -63,7 +63,7 @@ void SD_task_recycle_f(void *t)
   /* Reset the content */
   task->kind = SD_TASK_NOT_TYPED;
   task->state= SD_NOT_SCHEDULED;
-  xbt_dynar_push(sd_global->initial_task_set,&task);
+  sd_global->initial_task_set->push_back(task);
 
   task->marked = 0;
 
@@ -319,36 +319,39 @@ e_SD_task_state_t SD_task_get_state(SD_task_t task)
  */
 void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
 {
-  int idx;
+  std::vector<SD_task_t>::iterator idx;
   switch (new_state) {
   case SD_NOT_SCHEDULED:
   case SD_SCHEDULABLE:
     if (SD_task_get_state(task) == SD_FAILED){
-        xbt_dynar_remove_at(sd_global->completed_task_set,
-            xbt_dynar_search(sd_global->completed_task_set, &task), nullptr);
-        xbt_dynar_push(sd_global->initial_task_set,&task);
+      sd_global->initial_task_set->push_back(task);
+      sd_global->completed_task_set->erase(std::remove(sd_global->completed_task_set->begin(),
+                                                       sd_global->completed_task_set->end(), task),
+                                                       sd_global->completed_task_set->end());
     }
     break;
   case SD_SCHEDULED:
     if (SD_task_get_state(task) == SD_RUNNABLE){
-      xbt_dynar_remove_at(sd_global->executable_task_set,
-          xbt_dynar_search(sd_global->executable_task_set, &task), nullptr);
-      xbt_dynar_push(sd_global->initial_task_set,&task);
+      sd_global->initial_task_set->push_back(task);
+      sd_global->executable_task_set->erase(std::remove(sd_global->executable_task_set->begin(),
+                                                        sd_global->executable_task_set->end(), task),
+                                                        sd_global->executable_task_set->end());
     }
     break;
   case SD_RUNNABLE:
-    idx = xbt_dynar_search_or_negative(sd_global->initial_task_set, &task);
-    if (idx >= 0) {
-      xbt_dynar_remove_at(sd_global->initial_task_set, idx, nullptr);
-      xbt_dynar_push(sd_global->executable_task_set,&task);
+    idx = std::find(sd_global->initial_task_set->begin(), sd_global->initial_task_set->end(), task);
+    if (idx != sd_global->initial_task_set->end()) {
+      sd_global->executable_task_set->push_back(*idx);
+      sd_global->initial_task_set->erase(idx);
     }
     break;
   case SD_RUNNING:
-      xbt_dynar_remove_at(sd_global->executable_task_set,
-         xbt_dynar_search(sd_global->executable_task_set, &task), nullptr);
+    sd_global->executable_task_set->erase(std::remove(sd_global->executable_task_set->begin(),
+                                                      sd_global->executable_task_set->end(), task),
+                                                      sd_global->executable_task_set->end());
     break;
   case SD_DONE:
-    xbt_dynar_push(sd_global->completed_task_set,&task);
+    sd_global->completed_task_set->push_back(task);
     task->finish_time = task->surf_action->getFinishTime();
     task->remains = 0;
 #if HAVE_JEDULE
@@ -356,7 +359,7 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
 #endif
     break;
   case SD_FAILED:
-    xbt_dynar_push(sd_global->completed_task_set,&task);
+    sd_global->completed_task_set->push_back(task);
     break;
   default:
     xbt_die( "Invalid state");
index 28e8664..af47f34 100644 (file)
@@ -6,7 +6,7 @@
 
 #ifndef SIMDAG_PRIVATE_H
 #define SIMDAG_PRIVATE_H
-
+#include <vector>
 #include "xbt/dynar.h"
 #include "simgrid/simdag.h"
 #include "surf/surf.h"
@@ -22,9 +22,9 @@ typedef struct SD_global {
 
   bool watch_point_reached;      /* has a task just reached a watch point? */
 
-  xbt_dynar_t initial_task_set;
-  xbt_dynar_t executable_task_set;
-  xbt_dynar_t completed_task_set;
+  std::vector<SD_task_t> *initial_task_set;
+  std::vector<SD_task_t> *executable_task_set;
+  std::vector<SD_task_t> *completed_task_set;
 
   xbt_dynar_t return_set;