Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge s4u wait_any
[simgrid.git] / src / simdag / sd_task.cpp
index 9b677f8..33d2b5d 100644 (file)
@@ -52,9 +52,6 @@ void SD_task_recycle_f(void *t)
   task->watch_points = 0;
 
   /* dependencies */
-  task->unsatisfied_dependencies = 0;
-  task->is_not_ready = 0;
-
   task->inputs->clear();
   task->outputs->clear();
   task->predecessors->clear();
@@ -288,7 +285,7 @@ void SD_task_set_data(SD_task_t task, void *data)
 void SD_task_set_rate(SD_task_t task, double rate)
 {
   xbt_assert(task->kind == SD_TASK_COMM_E2E, "The rate can be modified for end-to-end communications only.");
-  if(task->start_time<0) {
+  if(task->state < SD_RUNNING) {
     task->rate = rate;
   } else {
     XBT_WARN("Task %p has started. Changing rate is ineffective.", task);
@@ -313,6 +310,7 @@ 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)
 {
   std::set<SD_task_t>::iterator idx;
+  XBT_DEBUG("Set state of '%s' to %d", task->name, new_state);
   switch (new_state) {
   case SD_NOT_SCHEDULED:
   case SD_SCHEDULABLE:
@@ -324,22 +322,25 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
   case SD_SCHEDULED:
     if (SD_task_get_state(task) == SD_RUNNABLE){
       sd_global->initial_tasks->insert(task);
-      sd_global->executable_tasks->erase(task);
+      sd_global->runnable_tasks->erase(task);
     }
     break;
   case SD_RUNNABLE:
     idx = sd_global->initial_tasks->find(task);
     if (idx != sd_global->initial_tasks->end()) {
-      sd_global->executable_tasks->insert(*idx);
+      sd_global->runnable_tasks->insert(*idx);
       sd_global->initial_tasks->erase(idx);
     }
     break;
   case SD_RUNNING:
-    sd_global->executable_tasks->erase(task);
+    sd_global->runnable_tasks->erase(task);
     break;
   case SD_DONE:
     sd_global->completed_tasks->insert(task);
+    task->start_time = task->surf_action->getStartTime();
     task->finish_time = task->surf_action->getFinishTime();
+    task->surf_action->unref();
+    task->surf_action = nullptr;
     task->remains = 0;
 #if HAVE_JEDULE
     jedule_log_sd_event(task);
@@ -347,6 +348,10 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
     break;
   case SD_FAILED:
     sd_global->completed_tasks->insert(task);
+    task->start_time = task->surf_action->getStartTime();
+    task->finish_time = surf_get_clock();
+    task->surf_action->unref();
+    task->surf_action = nullptr;
     break;
   default:
     xbt_die( "Invalid state");
@@ -356,7 +361,7 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
 
   if (task->watch_points & new_state) {
     XBT_VERB("Watch point reached with task '%s'!", SD_task_get_name(task));
-    sd_global->watch_point_reached = 1;
+    sd_global->watch_point_reached = true;
     SD_task_unwatch(task, new_state);   /* remove the watch point */
   }
 }
@@ -531,13 +536,10 @@ void SD_task_dump(SD_task_t task)
     }
   }
 
-  if (task->category)
-    XBT_INFO("  - tracing category: %s", task->category);
-
   XBT_INFO("  - amount: %.0f", SD_task_get_amount(task));
   if (task->kind == SD_TASK_COMP_PAR_AMDAHL)
     XBT_INFO("  - alpha: %.2f", task->alpha);
-  XBT_INFO("  - Dependencies to satisfy: %d", task->unsatisfied_dependencies);
+  XBT_INFO("  - Dependencies to satisfy: %zu", task->inputs->size()+ task->predecessors->size());
   if ((task->inputs->size()+ task->predecessors->size()) > 0) {
     XBT_INFO("  - pre-dependencies:");
     for (std::set<SD_task_t>::iterator it=task->predecessors->begin(); it!=task->predecessors->end(); ++it)
@@ -636,9 +638,6 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src, SD_task
     dst->predecessors->insert(src);
   }
 
-  dst->unsatisfied_dependencies++;
-  dst->is_not_ready++;
-
   /* if the task was runnable, the task goes back to SD_SCHEDULED because of the new dependency*/
   if (SD_task_get_state(dst) == SD_RUNNABLE) {
     XBT_DEBUG("SD_task_dependency_add: %s was runnable and becomes scheduled!", SD_task_get_name(dst));
@@ -680,7 +679,6 @@ int SD_task_dependency_exists(SD_task_t src, SD_task_t dst)
  */
 void SD_task_dependency_remove(SD_task_t src, SD_task_t dst)
 {
-
   XBT_DEBUG("SD_task_dependency_remove: src = %s, dst = %s", SD_task_get_name(src), SD_task_get_name(dst));
 
   if (src->successors->find(dst) == src->successors->end() &&
@@ -688,12 +686,6 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst)
     THROWF(arg_error, 0, "No dependency found between task '%s' and '%s': task '%s' is not a successor of task '%s'",
            SD_task_get_name(src), SD_task_get_name(dst), SD_task_get_name(dst), SD_task_get_name(src));
 
-  if (dst->predecessors->find(src) != dst->predecessors->end() ||
-      dst->inputs->find(src) != dst->inputs->end()){
-    dst->unsatisfied_dependencies--;
-    dst->is_not_ready--;
-  }
-
   e_SD_task_kind_t src_kind = SD_task_get_kind(src);
   e_SD_task_kind_t dst_kind = SD_task_get_kind(dst);
   if (src_kind == SD_TASK_COMM_E2E || src_kind == SD_TASK_COMM_PAR_MXN_1D_BLOCK){
@@ -713,15 +705,8 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst)
   }
 
   /* if the task was scheduled and dependencies are satisfied, we can make it runnable */
-  if (dst->unsatisfied_dependencies == 0) {
-    if (SD_task_get_state(dst) == SD_SCHEDULED)
-      SD_task_set_state(dst, SD_RUNNABLE);
-    else
-      SD_task_set_state(dst, SD_SCHEDULABLE);
-  }
-
-  if (dst->is_not_ready == 0)
-    SD_task_set_state(dst, SD_SCHEDULABLE);
+  if (dst->predecessors->empty() && dst->inputs->empty() && SD_task_get_state(dst) == SD_SCHEDULED)
+    SD_task_set_state(dst, SD_RUNNABLE);
 }
 
 /**
@@ -802,7 +787,7 @@ static inline void SD_task_do_schedule(SD_task_t task)
   if (SD_task_get_state(task) > SD_SCHEDULABLE)
     THROWF(arg_error, 0, "Task '%s' has already been scheduled", SD_task_get_name(task));
 
-  if (task->unsatisfied_dependencies == 0)
+  if (task->predecessors->empty() && task->inputs->empty())
     SD_task_set_state(task, SD_RUNNABLE);
   else
     SD_task_set_state(task, SD_SCHEDULED);
@@ -884,7 +869,7 @@ void SD_task_unschedule(SD_task_t task)
     /* the task should become SD_FAILED */
     task->surf_action->cancel();
   else {
-    if (task->unsatisfied_dependencies == 0)
+    if (task->predecessors->empty() && task->inputs->empty())
       SD_task_set_state(task, SD_SCHEDULABLE);
     else
       SD_task_set_state(task, SD_NOT_SCHEDULED);
@@ -923,11 +908,9 @@ void SD_task_run(SD_task_t task)
 
   XBT_DEBUG("surf_action = %p", task->surf_action);
 
-  if (task->category)
-    TRACE_surf_action(task->surf_action, task->category);
-
   __SD_task_destroy_scheduling_data(task);      /* now the scheduling data are not useful anymore */
   SD_task_set_state(task, SD_RUNNING);
+  xbt_dynar_push(sd_global->return_set, &task);
 }
 
 /**