Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change the way a task is considered as ready
authorsuter <suter@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 11 Jun 2010 13:55:15 +0000 (13:55 +0000)
committersuter <suter@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 11 Jun 2010 13:55:15 +0000 (13:55 +0000)
  Instead of removing dependencies when a task is done, a counter is
  decreased
  This way, it is always possible to reach ancestors thanks to
  the SD_taks_get_parents function.

Change the level of some logs in sd_global from INFO to VERB

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7835 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/simdag/private.h
src/simdag/sd_global.c
src/simdag/sd_task.c

index 9a90996..0d5223e 100644 (file)
@@ -87,6 +87,7 @@ typedef struct SD_task {
   /* dependencies */
   xbt_dynar_t tasks_before;
   xbt_dynar_t tasks_after;
   /* dependencies */
   xbt_dynar_t tasks_before;
   xbt_dynar_t tasks_after;
+  unsigned int unsatisfied_dependencies;
 
   /* scheduling parameters (only exist in state SD_SCHEDULED) */
   int workstation_nb;
 
   /* scheduling parameters (only exist in state SD_SCHEDULED) */
   int workstation_nb;
index 093b77e..aeab84f 100644 (file)
@@ -193,12 +193,12 @@ SD_task_t *SD_simulate(double how_long)
   surf_action_t action;
   SD_task_t *res = NULL;
   xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL);
   surf_action_t action;
   SD_task_t *res = NULL;
   xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL);
-  unsigned int iter;
+  unsigned int iter, depcnt;
   static int first_time = 1;
 
   SD_CHECK_INIT_DONE();
 
   static int first_time = 1;
 
   SD_CHECK_INIT_DONE();
 
-  INFO0("Starting simulation...");
+  VERB0("Starting simulation...");
 
   if (first_time) {
     surf_presolve();            /* Takes traces into account */
 
   if (first_time) {
     surf_presolve();            /* Takes traces into account */
@@ -213,7 +213,7 @@ SD_task_t *SD_simulate(double how_long)
 
   /* explore the ready tasks */
   xbt_swag_foreach_safe(task, task_safe, sd_global->ready_task_set) {
 
   /* explore the ready tasks */
   xbt_swag_foreach_safe(task, task_safe, sd_global->ready_task_set) {
-    INFO1("Executing task '%s'", SD_task_get_name(task));
+    VERB1("Executing task '%s'", SD_task_get_name(task));
     if (__SD_task_try_to_run(task) && !xbt_dynar_member(changed_tasks, &task))
       xbt_dynar_push(changed_tasks, &task);
   }
     if (__SD_task_try_to_run(task) && !xbt_dynar_member(changed_tasks, &task))
       xbt_dynar_push(changed_tasks, &task);
   }
@@ -242,7 +242,7 @@ SD_task_t *SD_simulate(double how_long)
         task = action->data;
         task->start_time = surf_workstation_model->action_get_start_time(task->surf_action);
         task->finish_time = surf_get_clock();
         task = action->data;
         task->start_time = surf_workstation_model->action_get_start_time(task->surf_action);
         task->finish_time = surf_get_clock();
-        INFO1("Task '%s' done", SD_task_get_name(task));
+        VERB1("Task '%s' done", SD_task_get_name(task));
         DEBUG0("Calling __SD_task_just_done");
         __SD_task_just_done(task);
         DEBUG1("__SD_task_just_done called on task '%s'",
         DEBUG0("Calling __SD_task_just_done");
         __SD_task_just_done(task);
         DEBUG1("__SD_task_just_done called on task '%s'",
@@ -253,14 +253,17 @@ SD_task_t *SD_simulate(double how_long)
           xbt_dynar_push(changed_tasks, &task);
 
         /* remove the dependencies after this task */
           xbt_dynar_push(changed_tasks, &task);
 
         /* remove the dependencies after this task */
-        while (xbt_dynar_length(task->tasks_after) > 0) {
-          xbt_dynar_get_cpy(task->tasks_after, 0, &dependency);
-          dst = dependency->dst;
-          SD_task_dependency_remove(task, dst);
+        xbt_dynar_foreach(task->tasks_after, depcnt, dependency){
+                       dst = dependency->dst;
+          if (dst->unsatisfied_dependencies>0)
+                 dst->unsatisfied_dependencies--;
+
+          if (!(dst->unsatisfied_dependencies) && __SD_task_is_scheduled(dst))
+                 __SD_task_set_state(dst, SD_READY);
 
           /* is dst ready now? */
           if (__SD_task_is_ready(dst) && !sd_global->watch_point_reached) {
 
           /* is dst ready now? */
           if (__SD_task_is_ready(dst) && !sd_global->watch_point_reached) {
-            INFO1("Executing task '%s'", SD_task_get_name(dst));
+            VERB1("Executing task '%s'", SD_task_get_name(dst));
             if (__SD_task_try_to_run(dst) &&
                 !xbt_dynar_member(changed_tasks, &task))
               xbt_dynar_push(changed_tasks, &task);
             if (__SD_task_try_to_run(dst) &&
                 !xbt_dynar_member(changed_tasks, &task))
               xbt_dynar_push(changed_tasks, &task);
@@ -273,7 +276,7 @@ SD_task_t *SD_simulate(double how_long)
         task = action->data;
         task->start_time = surf_workstation_model->action_get_start_time(task->surf_action);
         task->finish_time = surf_get_clock();
         task = action->data;
         task->start_time = surf_workstation_model->action_get_start_time(task->surf_action);
         task->finish_time = surf_get_clock();
-        INFO1("Task '%s' failed", SD_task_get_name(task));
+        VERB1("Task '%s' failed", SD_task_get_name(task));
         __SD_task_set_state(task, SD_FAILED);
         surf_workstation_model->action_unref(action);
         task->surf_action = NULL;
         __SD_task_set_state(task, SD_FAILED);
         surf_workstation_model->action_unref(action);
         task->surf_action = NULL;
@@ -294,7 +297,7 @@ SD_task_t *SD_simulate(double how_long)
   }
   xbt_dynar_free(&changed_tasks);
 
   }
   xbt_dynar_free(&changed_tasks);
 
-  INFO0("Simulation finished");
+  VERB0("Simulation finished");
   DEBUG3("elapsed_time = %f, total_time = %f, watch_point_reached = %d",
          elapsed_time, total_time, sd_global->watch_point_reached);
   DEBUG1("current time = %f", surf_get_clock());
   DEBUG3("elapsed_time = %f, total_time = %f, watch_point_reached = %d",
          elapsed_time, total_time, sd_global->watch_point_reached);
   DEBUG1("current time = %f", surf_get_clock());
index 0de83bb..edd85d0 100644 (file)
@@ -52,7 +52,7 @@ SD_task_t SD_task_create(const char *name, void *data, double amount)
   /* dependencies */
   task->tasks_before = xbt_dynar_new(sizeof(SD_dependency_t), NULL);
   task->tasks_after = xbt_dynar_new(sizeof(SD_dependency_t), NULL);
   /* dependencies */
   task->tasks_before = xbt_dynar_new(sizeof(SD_dependency_t), NULL);
   task->tasks_after = xbt_dynar_new(sizeof(SD_dependency_t), NULL);
-
+  task->unsatisfied_dependencies=0;
   /* scheduling parameters */
   task->workstation_nb = 0;
   task->workstation_list = NULL;
   /* scheduling parameters */
   task->workstation_nb = 0;
   task->workstation_list = NULL;
@@ -150,7 +150,7 @@ void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
   task->state = new_state;
 
   if (task->watch_points & new_state) {
   task->state = new_state;
 
   if (task->watch_points & new_state) {
-    INFO1("Watch point reached with task '%s'!", SD_task_get_name(task));
+    VERB1("Watch point reached with task '%s'!", SD_task_get_name(task));
     sd_global->watch_point_reached = 1;
     SD_task_unwatch(task, new_state);   /* remove the watch point */
   }
     sd_global->watch_point_reached = 1;
     SD_task_unwatch(task, new_state);   /* remove the watch point */
   }
@@ -314,6 +314,7 @@ void SD_task_dump(SD_task_t task)
     }
   }
   INFO1("  - amount: %.0f",SD_task_get_amount(task));
     }
   }
   INFO1("  - amount: %.0f",SD_task_get_amount(task));
+  INFO1("  - Dependencies to satisfy: %d", task->unsatisfied_dependencies);
   if (xbt_dynar_length(task->tasks_before)) {
     INFO0("  - pre-dependencies:");
     xbt_dynar_foreach(task->tasks_before,counter,dependency) {
   if (xbt_dynar_length(task->tasks_before)) {
     INFO0("  - pre-dependencies:");
     xbt_dynar_foreach(task->tasks_before,counter,dependency) {
@@ -426,6 +427,8 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src,
   xbt_dynar_push(src->tasks_after, &dependency);
   xbt_dynar_push(dst->tasks_before, &dependency);
 
   xbt_dynar_push(src->tasks_after, &dependency);
   xbt_dynar_push(dst->tasks_before, &dependency);
 
+  dst->unsatisfied_dependencies++;
+
   /* if the task was ready, then dst->tasks_before is not empty anymore,
      so we must go back to state SD_SCHEDULED */
   if (__SD_task_is_ready(dst)) {
   /* if the task was ready, then dst->tasks_before is not empty anymore,
      so we must go back to state SD_SCHEDULED */
   if (__SD_task_is_ready(dst)) {
@@ -516,6 +519,7 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst)
     if (dependency->src == src) {
       xbt_dynar_remove_at(dynar, i, NULL);
       __SD_task_dependency_destroy(dependency);
     if (dependency->src == src) {
       xbt_dynar_remove_at(dynar, i, NULL);
       __SD_task_dependency_destroy(dependency);
+      dst->unsatisfied_dependencies--;
       found = 1;
     }
   }
       found = 1;
     }
   }
@@ -526,7 +530,8 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst)
               SD_task_get_name(src), SD_task_get_name(dst));
 
   /* if the task was scheduled and dst->tasks_before is empty now, we can make it ready */
               SD_task_get_name(src), SD_task_get_name(dst));
 
   /* if the task was scheduled and dst->tasks_before is empty now, we can make it ready */
-  if (xbt_dynar_length(dst->tasks_before) == 0 && __SD_task_is_scheduled(dst))
+
+   if (dst->unsatisfied_dependencies == 0 && __SD_task_is_scheduled(dst))
     __SD_task_set_state(dst, SD_READY);
 
   /*  __SD_print_dependencies(src);
     __SD_task_set_state(dst, SD_READY);
 
   /*  __SD_print_dependencies(src);
@@ -687,7 +692,7 @@ static XBT_INLINE void SD_task_do_schedule(SD_task_t task) {
             SD_task_get_name(task));
 
  /* update the task state */
             SD_task_get_name(task));
 
  /* update the task state */
-  if (xbt_dynar_length(task->tasks_before) == 0)
+  if (task->unsatisfied_dependencies == 0)
     __SD_task_set_state(task, SD_READY);
   else
     __SD_task_set_state(task, SD_SCHEDULED);
     __SD_task_set_state(task, SD_READY);
   else
     __SD_task_set_state(task, SD_SCHEDULED);