Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove a huge memory leak
authorthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 6 Jul 2006 21:08:48 +0000 (21:08 +0000)
committerthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 6 Jul 2006 21:08:48 +0000 (21:08 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2498 48e7efb5-ca39-0410-a469-dd3cf9ba447f

examples/simdag/mixtesim/src/main.c
examples/simdag/sd_test.c
src/simdag/sd_global.c
src/simdag/sd_link.c
src/simdag/sd_task.c
src/simdag/sd_workstation.c

index 5839fbb..20230df 100644 (file)
@@ -55,11 +55,11 @@ int main(int argc, char **argv) {
   createSimgridObjects();
   
   HEFT(dag);
   createSimgridObjects();
   
   HEFT(dag);
-
-  printDAG(dag);
+  
+  /* not recommanded with big DAGs! */
+  /* printDAG(dag); */
 
   changed_tasks = SD_simulate(-1.0);
 
   changed_tasks = SD_simulate(-1.0);
-
   INFO0("Tasks whose state has changed:");
   i = 0;
   while(changed_tasks[i] != NULL) {
   INFO0("Tasks whose state has changed:");
   i = 0;
   while(changed_tasks[i] != NULL) {
@@ -82,10 +82,11 @@ int main(int argc, char **argv) {
     default:
       INFO1("Unknown status for %s", SD_task_get_name(changed_tasks[i]));
       break;
     default:
       INFO1("Unknown status for %s", SD_task_get_name(changed_tasks[i]));
       break;
-    }
+      }
     i++;
   }
   free(changed_tasks);
     i++;
   }
   free(changed_tasks);
+  INFO1("Total: %d", i);
 
   /* clear some memory */
   freeNodeAttributes(dag);
 
   /* clear some memory */
   freeNodeAttributes(dag);
index e5f6f15..006bd08 100644 (file)
@@ -53,6 +53,7 @@ int main(int argc, char **argv) {
        SD_workstation_route_get_communication_time(w1, w2, communication_amount12));
   INFO4("Communication time for %f bytes between %s and %s: %f", communication_amount21, name2, name1,
        SD_workstation_route_get_communication_time(w2, w1, communication_amount21));
        SD_workstation_route_get_communication_time(w1, w2, communication_amount12));
   INFO4("Communication time for %f bytes between %s and %s: %f", communication_amount21, name2, name1,
        SD_workstation_route_get_communication_time(w2, w1, communication_amount21));
+  xbt_free(route);
 
   /* creation of the tasks and their dependencies */
   SD_task_t taskA = SD_task_create("Task A", NULL, 10.0);
 
   /* creation of the tasks and their dependencies */
   SD_task_t taskA = SD_task_create("Task A", NULL, 10.0);
@@ -128,11 +129,11 @@ int main(int argc, char **argv) {
       }
       i++;
     }
       }
       i++;
     }
-    free(changed_tasks);
+    xbt_free(changed_tasks);
     changed_tasks = SD_simulate(100);
   }
 
     changed_tasks = SD_simulate(100);
   }
 
-  free(changed_tasks);
+  xbt_free(changed_tasks);
 
   DEBUG0("Destroying tasks...");
 
 
   DEBUG0("Destroying tasks...");
 
index 7462f68..592a1e8 100644 (file)
@@ -124,8 +124,8 @@ SD_task_t* SD_simulate(double how_long)
   /* explore the ready tasks */
   xbt_swag_foreach(task, sd_global->ready_task_set) {
     INFO1("Executing task '%s'", SD_task_get_name(task));
   /* explore the ready tasks */
   xbt_swag_foreach(task, sd_global->ready_task_set) {
     INFO1("Executing task '%s'", SD_task_get_name(task));
-    action = __SD_task_run(task);
-    surf_workstation_resource->common_public->action_set_data(action, task);
+    task->surf_action = __SD_task_run(task);
+    surf_workstation_resource->common_public->action_set_data(task->surf_action, task);
     task->state_changed = 1;
     
     changed_tasks[changed_task_number++] = task; /* replace NULL by the task */
     task->state_changed = 1;
     
     changed_tasks[changed_task_number++] = task; /* replace NULL by the task */
@@ -145,6 +145,7 @@ SD_task_t* SD_simulate(double how_long)
     DEBUG1("Total time: %f", total_time);
 
     elapsed_time = surf_solve();
     DEBUG1("Total time: %f", total_time);
 
     elapsed_time = surf_solve();
+    DEBUG1("surf_solve() returns %f", elapsed_time);
     if (elapsed_time > 0.0)
       total_time += elapsed_time;
 
     if (elapsed_time > 0.0)
       total_time += elapsed_time;
 
@@ -153,6 +154,8 @@ SD_task_t* SD_simulate(double how_long)
       task = action->data;
       INFO1("Task '%s' done", SD_task_get_name(task));
       __SD_task_set_state(task, SD_DONE);
       task = action->data;
       INFO1("Task '%s' done", SD_task_get_name(task));
       __SD_task_set_state(task, SD_DONE);
+      xbt_free(action);
+      task->surf_action = NULL;
 
       /* the state has changed */
       if (!task->state_changed) {
 
       /* the state has changed */
       if (!task->state_changed) {
@@ -174,8 +177,8 @@ SD_task_t* SD_simulate(double how_long)
        /* is dst ready now? */
        if (__SD_task_is_ready(dst) && !sd_global->watch_point_reached) {
          INFO1("Executing task '%s'", SD_task_get_name(dst));
        /* is dst ready now? */
        if (__SD_task_is_ready(dst) && !sd_global->watch_point_reached) {
          INFO1("Executing task '%s'", SD_task_get_name(dst));
-         action = __SD_task_run(dst);
-         surf_workstation_resource->common_public->action_set_data(action, dst);
+         dst->surf_action = __SD_task_run(dst);
+         surf_workstation_resource->common_public->action_set_data(dst->surf_action, dst);
          dst->state_changed = 1;
          
          changed_tasks[changed_task_number++] = dst;
          dst->state_changed = 1;
          
          changed_tasks[changed_task_number++] = dst;
@@ -193,6 +196,9 @@ SD_task_t* SD_simulate(double how_long)
       task = action->data;
       INFO1("Task '%s' failed", SD_task_get_name(task));
       __SD_task_set_state(task, SD_FAILED);
       task = action->data;
       INFO1("Task '%s' failed", SD_task_get_name(task));
       __SD_task_set_state(task, SD_FAILED);
+      xbt_free(action);
+      task->surf_action = NULL;
+
       if (!task->state_changed) {
        task->state_changed = 1;
        changed_tasks[changed_task_number++] = task;
       if (!task->state_changed) {
        task->state_changed = 1;
        changed_tasks[changed_task_number++] = task;
index 3ab7818..33448bf 100644 (file)
@@ -32,21 +32,20 @@ const SD_link_t*  SD_link_get_list(void) {
   SD_CHECK_INIT_DONE();
   xbt_assert0(SD_link_get_number() > 0, "There is no link!");
 
   SD_CHECK_INIT_DONE();
   xbt_assert0(SD_link_get_number() > 0, "There is no link!");
 
-  SD_link_t *array = sd_global->link_list;
   xbt_dict_cursor_t cursor;
   char *key;
   void *data;
   int i;
 
   xbt_dict_cursor_t cursor;
   char *key;
   void *data;
   int i;
 
-  if (array == NULL) { /* this is the first time the function is called */
-    array = xbt_new0(SD_link_t, sd_global->link_count);
+  if (sd_global->link_list == NULL) { /* this is the first time the function is called */
+    sd_global->link_list = xbt_new0(SD_link_t, sd_global->link_count);
   
     i = 0;
     xbt_dict_foreach(sd_global->links, cursor, key, data) {
   
     i = 0;
     xbt_dict_foreach(sd_global->links, cursor, key, data) {
-      array[i++] = (SD_link_t) data;
+      sd_global->link_list[i++] = (SD_link_t) data;
     }
   }
     }
   }
-  return array;
+  return sd_global->link_list;
 }
 
 /**
 }
 
 /**
index c8961de..cf72e8b 100644 (file)
@@ -14,6 +14,7 @@ static void __SD_task_destroy_scheduling_data(SD_task_t task);
  *
  * \param name the name of the task (can be \c NULL)
  * \param data the user data you want to associate with the task (can be \c NULL)
  *
  * \param name the name of the task (can be \c NULL)
  * \param data the user data you want to associate with the task (can be \c NULL)
+ * \param amount amount of the task
  * \return the new task
  * \see SD_task_destroy()
  */
  * \return the new task
  * \see SD_task_destroy()
  */
@@ -583,6 +584,9 @@ void SD_task_destroy(SD_task_t task) {
   if (task->name != NULL)
     xbt_free(task->name);
 
   if (task->name != NULL)
     xbt_free(task->name);
 
+  if (task->surf_action != NULL)
+    xbt_free(task->surf_action);
+
   xbt_dynar_free(&task->tasks_before);
   xbt_dynar_free(&task->tasks_after);
   xbt_free(task);
   xbt_dynar_free(&task->tasks_before);
   xbt_dynar_free(&task->tasks_after);
   xbt_free(task);
index d9adace..84a2a0e 100644 (file)
@@ -49,21 +49,20 @@ const SD_workstation_t*  SD_workstation_get_list(void) {
   SD_CHECK_INIT_DONE();
   xbt_assert0(SD_workstation_get_number() > 0, "There is no workstation!");
 
   SD_CHECK_INIT_DONE();
   xbt_assert0(SD_workstation_get_number() > 0, "There is no workstation!");
 
-  SD_workstation_t *array = sd_global->workstation_list;
   xbt_dict_cursor_t cursor;
   char *key;
   void *data;
   int i;
 
   xbt_dict_cursor_t cursor;
   char *key;
   void *data;
   int i;
 
-  if (array == NULL) { /* this is the first time the function is called */
-    array = xbt_new0(SD_workstation_t, sd_global->workstation_count);
+  if (sd_global->workstation_list == NULL) { /* this is the first time the function is called */
+    sd_global->workstation_list = xbt_new0(SD_workstation_t, sd_global->workstation_count);
   
     i = 0;
     xbt_dict_foreach(sd_global->workstations, cursor, key, data) {
   
     i = 0;
     xbt_dict_foreach(sd_global->workstations, cursor, key, data) {
-      array[i++] = (SD_workstation_t) data;
+      sd_global->workstation_list[i++] = (SD_workstation_t) data;
     }
   }
     }
   }
-  return array;
+  return sd_global->workstation_list;
 }
 
 /**
 }
 
 /**
@@ -292,6 +291,7 @@ double SD_route_get_communication_time(SD_workstation_t src, SD_workstation_t ds
     if (bandwidth < min_bandwidth || min_bandwidth == -1.0)
       min_bandwidth = bandwidth;
   }
     if (bandwidth < min_bandwidth || min_bandwidth == -1.0)
       min_bandwidth = bandwidth;
   }
+  xbt_free(links);
 
   return latency + (communication_amount / min_bandwidth);
 }
 
   return latency + (communication_amount / min_bandwidth);
 }