X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f783ed4680c6862a1b7543237e89d1221334bae0..c3e8d8eb4778b6200f460b86dd83b1fcfbef7ec4:/src/simdag/sd_task.c diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index 57e34a8677..7546cc4f55 100644 --- a/src/simdag/sd_task.c +++ b/src/simdag/sd_task.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2006, 2007, 2008, 2009, 2010. The SimGrid Team. +/* Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -16,47 +16,39 @@ 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); -/** - * \brief Creates a new 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() - */ -SD_task_t SD_task_create(const char *name, void *data, double amount) +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); - SD_task_t task; - SD_CHECK_INIT_DONE(); + return task; +} - task = xbt_new(s_SD_task_t, 1); +void SD_task_recycle_f(void *t) +{ + SD_task_t task = (SD_task_t) t; - /* general information */ - task->data = data; /* user data */ - task->name = xbt_strdup(name); + /* Reset the content */ task->kind = SD_TASK_NOT_TYPED; task->state_hookup.prev = NULL; task->state_hookup.next = NULL; task->state_set = sd_global->not_scheduled_task_set; + xbt_swag_insert(task, task->state_set); task->state = SD_NOT_SCHEDULED; task->return_hookup.prev = NULL; task->return_hookup.next = NULL; task->marked = 0; - xbt_swag_insert(task, task->state_set); - task->amount = amount; - task->remains = amount; task->start_time = -1.0; task->finish_time = -1.0; task->surf_action = NULL; task->watch_points = 0; /* dependencies */ - task->tasks_before = xbt_dynar_new(sizeof(SD_dependency_t), NULL); - 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; @@ -66,6 +58,35 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) task->computation_amount = NULL; task->communication_amount = NULL; task->rate = -1; +} + +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. + * + * \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() + */ +SD_task_t SD_task_create(const char *name, void *data, double amount) +{ + SD_task_t task = xbt_mallocator_get(sd_global->task_mallocator); + + /* general information */ + task->data = data; /* user data */ + task->name = xbt_strdup(name); + task->amount = amount; + task->remains = amount; sd_global->task_number++; @@ -76,6 +97,46 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) return task; } +/** + * \brief Destroys a task. + * + * The user data (if any) should have been destroyed first. + * + * \param task the task you want to destroy + * \see SD_task_create() + */ +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 * @@ -85,8 +146,6 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) */ void *SD_task_get_data(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); return task->data; } @@ -102,8 +161,6 @@ void *SD_task_get_data(SD_task_t task) */ void SD_task_set_data(SD_task_t task, void *data) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); task->data = data; } @@ -117,8 +174,6 @@ void SD_task_set_data(SD_task_t task, void *data) */ e_SD_task_state_t SD_task_get_state(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); return task->state; } @@ -181,8 +236,6 @@ void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) */ const char *SD_task_get_name(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); return task->name; } @@ -204,8 +257,6 @@ xbt_dynar_t SD_task_get_parents(SD_task_t task) unsigned int i; xbt_dynar_t parents; SD_dependency_t dep; - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); parents = xbt_dynar_new(sizeof(SD_task_t), NULL); xbt_dynar_foreach(task->tasks_before, i, dep) { @@ -224,8 +275,6 @@ xbt_dynar_t SD_task_get_children(SD_task_t task) unsigned int i; xbt_dynar_t children; SD_dependency_t dep; - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); children = xbt_dynar_new(sizeof(SD_task_t), NULL); xbt_dynar_foreach(task->tasks_after, i, dep) { @@ -242,10 +291,6 @@ xbt_dynar_t SD_task_get_children(SD_task_t task) */ int SD_task_get_workstation_count(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); - //xbt_assert(task->state_set != sd_global->scheduled_task_set, - // "Unscheduled task %s", task->name); return task->workstation_nb; } @@ -257,10 +302,6 @@ int SD_task_get_workstation_count(SD_task_t task) */ SD_workstation_t *SD_task_get_workstation_list(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); - //xbt_assert(task->state_set != sd_global->scheduled_task_set, - // "Unscheduled task %s", task->name); return task->workstation_list; } @@ -273,8 +314,6 @@ SD_workstation_t *SD_task_get_workstation_list(SD_task_t task) */ double SD_task_get_amount(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); return task->amount; } @@ -287,9 +326,6 @@ double SD_task_get_amount(SD_task_t task) */ double SD_task_get_remaining_amount(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); - if (task->surf_action) return surf_workstation_model->get_remains(task->surf_action); else @@ -403,9 +439,6 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src, int i; SD_dependency_t dependency; - SD_CHECK_INIT_DONE(); - xbt_assert(src != NULL && dst != NULL, "Invalid parameter"); - dynar = src->tasks_after; length = xbt_dynar_length(dynar); @@ -481,7 +514,6 @@ int SD_task_dependency_exists(SD_task_t src, SD_task_t dst) unsigned int counter; SD_dependency_t dependency; - SD_CHECK_INIT_DONE(); xbt_assert(src != NULL || dst != NULL, "Invalid parameter: both src and dst are NULL"); @@ -517,9 +549,6 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) int i; SD_dependency_t dependency; - SD_CHECK_INIT_DONE(); - xbt_assert(src != NULL && dst != NULL, "Invalid parameter"); - /* remove the dependency from src->tasks_after */ dynar = src->tasks_after; length = xbt_dynar_length(dynar); @@ -591,10 +620,6 @@ void *SD_task_dependency_get_data(SD_task_t src, SD_task_t dst) int i; SD_dependency_t dependency; - - SD_CHECK_INIT_DONE(); - xbt_assert(src != NULL && dst != NULL, "Invalid parameter"); - dynar = src->tasks_after; length = xbt_dynar_length(dynar); @@ -645,9 +670,6 @@ static void __SD_print_watch_points(SD_task_t task) */ void SD_task_watch(SD_task_t task, e_SD_task_state_t state) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); - if (state & SD_NOT_SCHEDULED) THROWF(arg_error, 0, "Cannot add a watch point for state SD_NOT_SCHEDULED"); @@ -665,8 +687,6 @@ void SD_task_watch(SD_task_t task, e_SD_task_state_t state) */ void SD_task_unwatch(SD_task_t task, e_SD_task_state_t state) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); xbt_assert(state != SD_NOT_SCHEDULED, "SimDag error: Cannot have a watch point for state SD_NOT_SCHEDULED"); @@ -696,9 +716,7 @@ double SD_task_get_execution_time(SD_task_t task, { double time, max_time = 0.0; int i, j; - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL && workstation_nb > 0 - && workstation_list != NULL, "Invalid parameter"); + xbt_assert(workstation_nb > 0, "Invalid parameter"); /* the task execution time is the maximum execution time of the parallel tasks */ @@ -728,8 +746,6 @@ double SD_task_get_execution_time(SD_task_t task, static XBT_INLINE void SD_task_do_schedule(SD_task_t task) { - SD_CHECK_INIT_DONE(); - if (!__SD_task_is_not_scheduled(task) && !__SD_task_is_schedulable(task)) THROWF(arg_error, 0, "Task '%s' has already been scheduled", SD_task_get_name(task)); @@ -811,9 +827,6 @@ void SD_task_schedule(SD_task_t task, int workstation_count, */ void SD_task_unschedule(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); - if (task->state_set != sd_global->scheduled_task_set && task->state_set != sd_global->runnable_task_set && task->state_set != sd_global->running_task_set && @@ -842,7 +855,6 @@ void SD_task_unschedule(SD_task_t task) */ static void __SD_task_destroy_scheduling_data(SD_task_t task) { - SD_CHECK_INIT_DONE(); if (!__SD_task_is_scheduled_or_runnable(task) && !__SD_task_is_in_fifo(task)) THROWF(arg_error, 0, @@ -864,8 +876,6 @@ void __SD_task_really_run(SD_task_t task) int i; void **surf_workstations; - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); xbt_assert(__SD_task_is_runnable_or_in_fifo(task), "Task '%s' is not runnable or in a fifo! Task state: %d", SD_task_get_name(task), SD_task_get_state(task)); @@ -987,8 +997,6 @@ int __SD_task_try_to_run(SD_task_t task) int i; SD_workstation_t workstation; - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); xbt_assert(__SD_task_is_runnable(task), "Task '%s' is not runnable! Task state: %d", SD_task_get_name(task), SD_task_get_state(task)); @@ -1037,8 +1045,6 @@ void __SD_task_just_done(SD_task_t task) SD_task_t *candidates; int can_start = 1; - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); xbt_assert(__SD_task_is_running(task), "The task must be running! Task state: %d", SD_task_get_state(task)); @@ -1204,8 +1210,6 @@ static void __SD_task_remove_dependencies(SD_task_t task) */ double SD_task_get_start_time(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); if (task->surf_action) return surf_workstation_model-> action_get_start_time(task->surf_action); @@ -1226,9 +1230,6 @@ double SD_task_get_start_time(SD_task_t task) */ double SD_task_get_finish_time(SD_task_t task) { - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); - if (task->surf_action) /* should never happen as actions are destroyed right after their completion */ return surf_workstation_model-> action_get_finish_time(task->surf_action); @@ -1236,57 +1237,6 @@ double SD_task_get_finish_time(SD_task_t task) return task->finish_time; } -/** - * \brief Destroys a task. - * - * The user data (if any) should have been destroyed first. - * - * \param task the task you want to destroy - * \see SD_task_create() - */ -void SD_task_destroy(SD_task_t task) -{ - SD_CHECK_INIT_DONE(); - xbt_assert(task != NULL, "Invalid parameter"); - - 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); - 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 - - xbt_dynar_free(&task->tasks_before); - xbt_dynar_free(&task->tasks_after); - xbt_free(task); - - sd_global->task_number--; - - XBT_DEBUG("Task destroyed."); -} - - static XBT_INLINE SD_task_t SD_task_create_sized(const char *name, void *data, double amount, int ws_count)