From c3e8d8eb4778b6200f460b86dd83b1fcfbef7ec4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christophe=20Thi=C3=A9ry?= Date: Thu, 3 Nov 2011 12:06:01 +0100 Subject: [PATCH 1/1] Fix the mallocator of SimDag tasks. Tasks were uninitialized too late (and with duplicated code), in SD_task_recycle_f() and SD_task_free_f(). The uninitialization code is now back in SD_task_destroy(). This fixes simdag-minmin-test. --- src/simdag/sd_task.c | 99 +++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 62 deletions(-) diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index bc6d454bbc..7546cc4f55 100644 --- a/src/simdag/sd_task.c +++ b/src/simdag/sd_task.c @@ -16,39 +16,18 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_task, sd, static void __SD_task_remove_dependencies(SD_task_t task); static void __SD_task_destroy_scheduling_data(SD_task_t task); -void* SD_task_new_f(void) { +void* SD_task_new_f(void) +{ SD_task_t task = xbt_new0(s_SD_task_t, 1); task->tasks_before = xbt_dynar_new(sizeof(SD_dependency_t), NULL); task->tasks_after = xbt_dynar_new(sizeof(SD_dependency_t), NULL); return task; } -void SD_task_recycle_f(void *t) { - SD_task_t task = (SD_task_t)t; - - __SD_task_remove_dependencies(task); - /* if the task was scheduled or runnable we have to free the scheduling parameters */ - if (__SD_task_is_scheduled_or_runnable(task)) - __SD_task_destroy_scheduling_data(task); - if (task->state_set != NULL) {/* would be null if just created */ - xbt_swag_remove(task, task->state_set); - } - xbt_swag_remove(task, sd_global->return_set); - if (task->name != NULL) - xbt_free(task->name); - - if (task->surf_action != NULL) - surf_workstation_model->action_unref(task->surf_action); - - if (task->workstation_list != NULL) - xbt_free(task->workstation_list); - - if (task->communication_amount) - xbt_free(task->communication_amount); - - if (task->computation_amount) - xbt_free(task->computation_amount); +void SD_task_recycle_f(void *t) +{ + SD_task_t task = (SD_task_t) t; /* Reset the content */ task->kind = SD_TASK_NOT_TYPED; @@ -68,8 +47,8 @@ void SD_task_recycle_f(void *t) { task->watch_points = 0; /* dependencies */ - xbt_dynar_reset(task->tasks_before); // = new(sizeof(SD_dependency_t), NULL); - xbt_dynar_reset(task->tasks_after); // = xbt_dynar_new(sizeof(SD_dependency_t), NULL); + xbt_dynar_reset(task->tasks_before); + xbt_dynar_reset(task->tasks_after); task->unsatisfied_dependencies = 0; task->is_not_ready = 0; @@ -79,47 +58,17 @@ void SD_task_recycle_f(void *t) { task->computation_amount = NULL; task->communication_amount = NULL; task->rate = -1; - -#ifdef HAVE_TRACING - TRACE_sd_task_create(task); -#endif } -void SD_task_free_f(void *t) { - SD_task_t task = (SD_task_t)t; - - __SD_task_remove_dependencies(task); - /* if the task was scheduled or runnable we have to free the scheduling parameters */ - if (__SD_task_is_scheduled_or_runnable(task)) - __SD_task_destroy_scheduling_data(task); - if (task->state_set != NULL) /* would be null if just created */ - xbt_swag_remove(task, task->state_set); - - xbt_swag_remove(task, sd_global->return_set); - - if (task->name != NULL) - xbt_free(task->name); - - if (task->surf_action != NULL) - surf_workstation_model->action_unref(task->surf_action); - if (task->workstation_list != NULL) - xbt_free(task->workstation_list); - - if (task->communication_amount) - xbt_free(task->communication_amount); - - if (task->computation_amount) - xbt_free(task->computation_amount); -#ifdef HAVE_TRACING - TRACE_sd_task_destroy(task); -#endif +void SD_task_free_f(void *t) +{ + SD_task_t task = (SD_task_t)t; xbt_dynar_free(&task->tasks_before); xbt_dynar_free(&task->tasks_after); xbt_free(task); } - /** * \brief Creates a new task. * @@ -141,8 +90,13 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) sd_global->task_number++; +#ifdef HAVE_TRACING + TRACE_sd_task_create(task); +#endif + return task; } + /** * \brief Destroys a task. * @@ -155,13 +109,34 @@ void SD_task_destroy(SD_task_t task) { XBT_DEBUG("Destroying task %s...", SD_task_get_name(task)); + __SD_task_remove_dependencies(task); + /* if the task was scheduled or runnable we have to free the scheduling parameters */ + if (__SD_task_is_scheduled_or_runnable(task)) + __SD_task_destroy_scheduling_data(task); + if (task->state_set != NULL) /* would be null if just created */ + xbt_swag_remove(task, task->state_set); + + xbt_swag_remove(task, sd_global->return_set); + + xbt_free(task->name); + + if (task->surf_action != NULL) + surf_workstation_model->action_unref(task->surf_action); + + xbt_free(task->workstation_list); + xbt_free(task->communication_amount); + xbt_free(task->computation_amount); + xbt_mallocator_release(sd_global->task_mallocator,task); sd_global->task_number--; +#ifdef HAVE_TRACING + TRACE_sd_task_destroy(task); +#endif + XBT_DEBUG("Task destroyed."); } - /** * \brief Returns the user data of a task * -- 2.20.1