From 659ba669d7e5726c70f22d33f62efec4f267f994 Mon Sep 17 00:00:00 2001 From: thiery Date: Thu, 6 Jul 2006 21:08:48 +0000 Subject: [PATCH] Remove a huge memory leak 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 | 9 +++++---- examples/simdag/sd_test.c | 5 +++-- src/simdag/sd_global.c | 14 ++++++++++---- src/simdag/sd_link.c | 9 ++++----- src/simdag/sd_task.c | 4 ++++ src/simdag/sd_workstation.c | 10 +++++----- 6 files changed, 31 insertions(+), 20 deletions(-) diff --git a/examples/simdag/mixtesim/src/main.c b/examples/simdag/mixtesim/src/main.c index 5839fbbd9d..20230dfb2b 100644 --- a/examples/simdag/mixtesim/src/main.c +++ b/examples/simdag/mixtesim/src/main.c @@ -55,11 +55,11 @@ int main(int argc, char **argv) { createSimgridObjects(); HEFT(dag); - - printDAG(dag); + + /* not recommanded with big DAGs! */ + /* printDAG(dag); */ changed_tasks = SD_simulate(-1.0); - 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; - } + } i++; } free(changed_tasks); + INFO1("Total: %d", i); /* clear some memory */ freeNodeAttributes(dag); diff --git a/examples/simdag/sd_test.c b/examples/simdag/sd_test.c index e5f6f156cb..006bd0836f 100644 --- a/examples/simdag/sd_test.c +++ b/examples/simdag/sd_test.c @@ -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)); + xbt_free(route); /* 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++; } - free(changed_tasks); + xbt_free(changed_tasks); changed_tasks = SD_simulate(100); } - free(changed_tasks); + xbt_free(changed_tasks); DEBUG0("Destroying tasks..."); diff --git a/src/simdag/sd_global.c b/src/simdag/sd_global.c index 7462f685e8..592a1e8112 100644 --- a/src/simdag/sd_global.c +++ b/src/simdag/sd_global.c @@ -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)); - 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 */ @@ -145,6 +145,7 @@ SD_task_t* SD_simulate(double how_long) 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; @@ -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); + xbt_free(action); + task->surf_action = NULL; /* 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)); - 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; @@ -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); + xbt_free(action); + task->surf_action = NULL; + if (!task->state_changed) { task->state_changed = 1; changed_tasks[changed_task_number++] = task; diff --git a/src/simdag/sd_link.c b/src/simdag/sd_link.c index 3ab7818b95..33448bf354 100644 --- a/src/simdag/sd_link.c +++ b/src/simdag/sd_link.c @@ -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_link_t *array = sd_global->link_list; 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) { - array[i++] = (SD_link_t) data; + sd_global->link_list[i++] = (SD_link_t) data; } } - return array; + return sd_global->link_list; } /** diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index c8961de29e..cf72e8b1a1 100644 --- a/src/simdag/sd_task.c +++ b/src/simdag/sd_task.c @@ -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 amount amount of the task * \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->surf_action != NULL) + xbt_free(task->surf_action); + xbt_dynar_free(&task->tasks_before); xbt_dynar_free(&task->tasks_after); xbt_free(task); diff --git a/src/simdag/sd_workstation.c b/src/simdag/sd_workstation.c index d9adace53a..84a2a0eac4 100644 --- a/src/simdag/sd_workstation.c +++ b/src/simdag/sd_workstation.c @@ -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_workstation_t *array = sd_global->workstation_list; 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) { - 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; } + xbt_free(links); return latency + (communication_amount / min_bandwidth); } -- 2.20.1