Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix SimDag compilation warnings.
[simgrid.git] / src / simdag / sd_task.c
index 3ae2ab9..5a64783 100644 (file)
@@ -3,8 +3,6 @@
 #include "xbt/sysdep.h"
 #include "xbt/dynar.h"
 
-static void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state);
-
 /* Creates a task.
  */
 SD_task_t SD_task_create(const char *name, void *data, double amount) {
@@ -21,9 +19,12 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) {
     task->name = NULL;
 
   task->state_set = sd_global->not_scheduled_task_set;
+  xbt_swag_insert(task,task->state_set);
+
   task->amount = amount;
   task->surf_action = NULL;
   task->watch_points = 0;
+  task->state_changed = 0;
 
   /* dependencies */
   task->tasks_before = xbt_dynar_new(sizeof(SD_dependency_t), NULL);
@@ -36,8 +37,6 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) {
   task->communication_amount = NULL;
   task->rate = 0;
 
-  xbt_dynar_push(sd_global->tasks, &task);
-
   return task;
 }
 
@@ -68,7 +67,7 @@ e_SD_task_state_t SD_task_get_state(SD_task_t task) {
 
 /* Changes the state of a task. Update the swags and the flag sd_global->watch_point_reached.
  */
-static void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) {
+void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) {
   xbt_swag_remove(task, task->state_set);
   switch (new_state) {
   case SD_NOT_SCHEDULED:
@@ -86,6 +85,7 @@ static void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) {
   default: /* SD_FAILED */
     task->state_set = sd_global->failed_task_set;
   }
+  xbt_swag_insert(task,task->state_set);
 
   if (task->watch_points & new_state) {
     printf("Watch point reached with task '%s' in state %d!\n", SD_task_get_name(task), new_state);
@@ -154,7 +154,7 @@ void __SD_print_dependencies(SD_task_t task) {
 
 /* Destroys a dependency between two tasks.
  */
-void __SD_task_destroy_dependency(void *dependency) {
+static void __SD_task_destroy_dependency(void *dependency) {
   if (((SD_dependency_t) dependency)->name != NULL)
     xbt_free(((SD_dependency_t) dependency)->name);
   xbt_free(dependency);
@@ -376,19 +376,9 @@ surf_action_t __SD_task_run(SD_task_t task) {
   return surf_action;
 }
 
-
-/* Destroys a task. The user data (if any) should have been destroyed first.
+/* Remove all dependencies associated with a task. This function is called when the task is done.
  */
-void SD_task_destroy(SD_task_t task) {
-  SD_CHECK_INIT_DONE();
-  xbt_assert0(task != NULL, "Invalid parameter");
-
-  /*printf("Destroying task %s...\n", SD_task_get_name(task));*/
-
-  /* remove the task from SimDag task list */
-  int index = xbt_dynar_search(sd_global->tasks, &task);
-  xbt_dynar_remove_at(sd_global->tasks, index, NULL);
-
+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 */
   SD_dependency_t dependency;
@@ -401,6 +391,17 @@ void SD_task_destroy(SD_task_t task) {
     xbt_dynar_get_cpy(task->tasks_after, 0, &dependency);
     SD_task_dependency_remove(dependency->src, dependency->dst);
   }
+}
+
+/* Destroys a task. The user data (if any) should have been destroyed first.
+ */
+void SD_task_destroy(SD_task_t task) {
+  SD_CHECK_INIT_DONE();
+  xbt_assert0(task != NULL, "Invalid parameter");
+
+  /*printf("Destroying task %s...\n", SD_task_get_name(task));*/
+
+  __SD_task_remove_dependencies(task);
 
   /* if the task was scheduled we have to free the scheduling parameters */
   if (SD_task_get_state(task) == SD_SCHEDULED)
@@ -414,5 +415,4 @@ void SD_task_destroy(SD_task_t task) {
   xbt_free(task);
 
   /*printf("Task destroyed.\n");*/
-
 }