Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
freaking paranoid flags!
[simgrid.git] / src / simdag / sd_task.cpp
index 386c765..40c8d70 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_tasks->insert(task);
 
   task->marked = 0;
 
@@ -319,36 +319,33 @@ 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::set<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->completed_tasks->erase(task);
+      sd_global->initial_tasks->insert(task);
     }
     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->executable_tasks->erase(task);
+      sd_global->initial_tasks->insert(task);
     }
     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_tasks->begin(), sd_global->initial_tasks->end(), task);
+    if (idx != sd_global->initial_tasks->end()) {
+      sd_global->initial_tasks->erase(idx);
+      sd_global->executable_tasks->insert(*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_tasks->erase(task);
     break;
   case SD_DONE:
-    xbt_dynar_push(sd_global->completed_task_set,&task);
+    sd_global->completed_tasks->insert(task);
     task->finish_time = task->surf_action->getFinishTime();
     task->remains = 0;
 #if HAVE_JEDULE
@@ -356,7 +353,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_tasks->insert(task);
     break;
   default:
     xbt_die( "Invalid state");
@@ -425,7 +422,7 @@ xbt_dynar_t SD_task_get_children(SD_task_t task)
 }
 
 /**
- * \brief Returns the amount of workstations involved in a task
+ * \brief Returns the number of workstations involved in a task
  *
  * Only call this on already scheduled tasks!
  * \param task a task
@@ -825,8 +822,9 @@ void SD_task_unwatch(SD_task_t task, e_SD_task_state_t state)
  * \param task the task to evaluate
  * \param workstation_nb number of workstations on which the task would be executed
  * \param workstation_list the workstations on which the task would be executed
- * \param flops_amount computation amount for each workstation
- * \param bytes_amount communication amount between each pair of workstations
+ * \param flops_amount computation amount for each workstation (i.e., an array of workstation_nb doubles)
+ * \param bytes_amount communication amount between each pair of workstations (i.e., a matrix of
+ *        workstation_nb*workstation_nb doubles)
  * \see SD_schedule()
  */
 double SD_task_get_execution_time(SD_task_t task, int workstation_nb, const sg_host_t *workstation_list,
@@ -875,10 +873,10 @@ static inline void SD_task_do_schedule(SD_task_t task)
  * Once scheduled, a task is executed as soon as possible in \see SD_simulate, i.e. when its dependencies are satisfied.
  *
  * \param task the task you want to schedule
- * \param host_count number of workstations on which the task will be executed
- * \param workstation_list the workstations on which the task will be executed
- * \param flops_amount computation amount for each workstation
- * \param bytes_amount communication amount between each pair of workstations
+ * \param host_count number of hosts on which the task will be executed
+ * \param workstation_list the hosts on which the task will be executed
+ * \param flops_amount computation amount for each hosts (i.e., an array of host_count doubles)
+ * \param bytes_amount communication amount between each pair of hosts (i.e., a matrix of host_count*host_count doubles)
  * \param rate task execution speed rate
  * \see SD_task_unschedule()
  */