X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1ecbb4c88462e9ec9be0c830a257da6e9b774a25..59ee07d949014eace7f574354a69fbba0fd2be4e:/src/simdag/sd_task.c diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index 57a59959d4..f1d202feca 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,44 +16,60 @@ 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; +} +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); - task = xbt_new(s_SD_task_t, 1); + if (task->name != NULL) + xbt_free(task->name); - /* general information */ - task->data = data; /* user data */ - task->name = xbt_strdup(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); + + /* 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); // = new(sizeof(SD_dependency_t), NULL); + xbt_dynar_reset(task->tasks_after); // = xbt_dynar_new(sizeof(SD_dependency_t), NULL); task->unsatisfied_dependencies = 0; task->is_not_ready = 0; @@ -64,14 +80,87 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) task->communication_amount = NULL; task->rate = -1; - sd_global->task_number++; - #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 + + 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++; 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)); + + xbt_mallocator_release(sd_global->task_mallocator,task); + sd_global->task_number--; + + XBT_DEBUG("Task destroyed."); +} + /** * \brief Returns the user data of a task @@ -83,7 +172,7 @@ 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_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); return task->data; } @@ -100,7 +189,7 @@ 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_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); task->data = data; } @@ -115,7 +204,7 @@ 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_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); return task->state; } @@ -179,7 +268,7 @@ 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_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); return task->name; } @@ -202,7 +291,7 @@ xbt_dynar_t SD_task_get_parents(SD_task_t task) xbt_dynar_t parents; SD_dependency_t dep; SD_CHECK_INIT_DONE(); - xbt_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); parents = xbt_dynar_new(sizeof(SD_task_t), NULL); xbt_dynar_foreach(task->tasks_before, i, dep) { @@ -222,7 +311,7 @@ xbt_dynar_t SD_task_get_children(SD_task_t task) xbt_dynar_t children; SD_dependency_t dep; SD_CHECK_INIT_DONE(); - xbt_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); children = xbt_dynar_new(sizeof(SD_task_t), NULL); xbt_dynar_foreach(task->tasks_after, i, dep) { @@ -240,8 +329,8 @@ 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_assert0(task != NULL, "Invalid parameter"); - // xbt_assert1( task->state_set != sd_global->scheduled_task_set, + 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; } @@ -255,8 +344,8 @@ 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_assert0(task != NULL, "Invalid parameter"); - //xbt_assert1( task->state_set != sd_global->scheduled_task_set, + 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; } @@ -271,7 +360,7 @@ 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_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); return task->amount; } @@ -285,7 +374,7 @@ double SD_task_get_amount(SD_task_t task) double SD_task_get_remaining_amount(SD_task_t task) { SD_CHECK_INIT_DONE(); - xbt_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); if (task->surf_action) return surf_workstation_model->get_remains(task->surf_action); @@ -401,25 +490,25 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src, SD_dependency_t dependency; SD_CHECK_INIT_DONE(); - xbt_assert0(src != NULL && dst != NULL, "Invalid parameter"); + xbt_assert(src != NULL && dst != NULL, "Invalid parameter"); dynar = src->tasks_after; length = xbt_dynar_length(dynar); if (src == dst) - THROW1(arg_error, 0, + THROWF(arg_error, 0, "Cannot add a dependency between task '%s' and itself", SD_task_get_name(src)); if (!__SD_task_is_not_scheduled(src) && !__SD_task_is_schedulable(src) && !__SD_task_is_scheduled_or_runnable(src)) - THROW1(arg_error, 0, + THROWF(arg_error, 0, "Task '%s' must be SD_NOT_SCHEDULED, SD_SCHEDULABLE, SD_SCHEDULED or SD_RUNNABLE", SD_task_get_name(src)); if (!__SD_task_is_not_scheduled(dst) && !__SD_task_is_schedulable(dst) && !__SD_task_is_scheduled_or_runnable(dst)) - THROW1(arg_error, 0, + THROWF(arg_error, 0, "Task '%s' must be SD_NOT_SCHEDULED, SD_SCHEDULABLE, SD_SCHEDULED or SD_RUNNABLE", SD_task_get_name(dst)); @@ -433,7 +522,7 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src, } if (found) - THROW2(arg_error, 0, + THROWF(arg_error, 0, "A dependency already exists between task '%s' and task '%s'", SD_task_get_name(src), SD_task_get_name(dst)); @@ -479,7 +568,7 @@ int SD_task_dependency_exists(SD_task_t src, SD_task_t dst) SD_dependency_t dependency; SD_CHECK_INIT_DONE(); - xbt_assert0(src != NULL + xbt_assert(src != NULL || dst != NULL, "Invalid parameter: both src and dst are NULL"); @@ -515,7 +604,7 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) SD_dependency_t dependency; SD_CHECK_INIT_DONE(); - xbt_assert0(src != NULL && dst != NULL, "Invalid parameter"); + xbt_assert(src != NULL && dst != NULL, "Invalid parameter"); /* remove the dependency from src->tasks_after */ dynar = src->tasks_after; @@ -529,7 +618,7 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) } } if (!found) - THROW4(arg_error, 0, + THROWF(arg_error, 0, "No dependency found between task '%s' and '%s': task '%s' is not a successor of task '%s'", SD_task_get_name(src), SD_task_get_name(dst), SD_task_get_name(dst), SD_task_get_name(src)); @@ -550,7 +639,7 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) } } /* should never happen... */ - xbt_assert4(found, + xbt_assert(found, "SimDag error: task '%s' is a successor of '%s' but task '%s' is not a predecessor of task '%s'", SD_task_get_name(dst), SD_task_get_name(src), SD_task_get_name(src), SD_task_get_name(dst)); @@ -590,7 +679,7 @@ void *SD_task_dependency_get_data(SD_task_t src, SD_task_t dst) SD_CHECK_INIT_DONE(); - xbt_assert0(src != NULL && dst != NULL, "Invalid parameter"); + xbt_assert(src != NULL && dst != NULL, "Invalid parameter"); dynar = src->tasks_after; length = xbt_dynar_length(dynar); @@ -600,7 +689,7 @@ void *SD_task_dependency_get_data(SD_task_t src, SD_task_t dst) found = (dependency->dst == dst); } if (!found) - THROW2(arg_error, 0, "No dependency found between task '%s' and '%s'", + THROWF(arg_error, 0, "No dependency found between task '%s' and '%s'", SD_task_get_name(src), SD_task_get_name(dst)); return dependency->data; } @@ -643,10 +732,10 @@ 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_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); if (state & SD_NOT_SCHEDULED) - THROW0(arg_error, 0, + THROWF(arg_error, 0, "Cannot add a watch point for state SD_NOT_SCHEDULED"); task->watch_points = task->watch_points | state; @@ -663,8 +752,8 @@ 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_assert0(task != NULL, "Invalid parameter"); - xbt_assert0(state != SD_NOT_SCHEDULED, + xbt_assert(task != NULL, "Invalid parameter"); + xbt_assert(state != SD_NOT_SCHEDULED, "SimDag error: Cannot have a watch point for state SD_NOT_SCHEDULED"); task->watch_points = task->watch_points & ~state; @@ -694,7 +783,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_assert0(task != NULL && workstation_nb > 0 + xbt_assert(task != NULL && workstation_nb > 0 && workstation_list != NULL, "Invalid parameter"); /* the task execution time is the maximum execution time of the parallel tasks */ @@ -728,7 +817,7 @@ 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)) - THROW1(arg_error, 0, "Task '%s' has already been scheduled", + THROWF(arg_error, 0, "Task '%s' has already been scheduled", SD_task_get_name(task)); /* update the task state */ @@ -746,7 +835,7 @@ static XBT_INLINE void SD_task_do_schedule(SD_task_t task) * i.e. when its dependencies are satisfied. * * \param task the task you want to schedule - * \param workstation_nb number of workstations on which the task will be executed + * \param workstation_count number of workstations on which the task will be executed * \param workstation_list the workstations on which the task will be executed * \param computation_amount computation amount for each workstation * \param communication_amount communication amount between each pair of workstations @@ -761,7 +850,7 @@ void SD_task_schedule(SD_task_t task, int workstation_count, int communication_nb; task->workstation_nb = 0; task->rate = -1; - xbt_assert0(workstation_count > 0, "workstation_nb must be positive"); + xbt_assert(workstation_count > 0, "workstation_nb must be positive"); task->workstation_nb = workstation_count; task->rate = rate; @@ -809,13 +898,13 @@ void SD_task_schedule(SD_task_t task, int workstation_count, void SD_task_unschedule(SD_task_t task) { SD_CHECK_INIT_DONE(); - xbt_assert0(task != NULL, "Invalid parameter"); + 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 && task->state_set != sd_global->failed_task_set) - THROW1(arg_error, 0, + THROWF(arg_error, 0, "Task %s: the state must be SD_SCHEDULED, SD_RUNNABLE, SD_RUNNING or SD_FAILED", SD_task_get_name(task)); @@ -842,7 +931,7 @@ 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)) - THROW1(arg_error, 0, + THROWF(arg_error, 0, "Task '%s' must be SD_SCHEDULED, SD_RUNNABLE or SD_IN_FIFO", SD_task_get_name(task)); @@ -862,11 +951,11 @@ void __SD_task_really_run(SD_task_t task) void **surf_workstations; SD_CHECK_INIT_DONE(); - xbt_assert0(task != NULL, "Invalid parameter"); - xbt_assert2(__SD_task_is_runnable_or_in_fifo(task), + 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)); - xbt_assert1(task->workstation_list != NULL, + xbt_assert(task->workstation_list != NULL, "Task '%s': workstation_list is NULL!", SD_task_get_name(task)); @@ -879,7 +968,7 @@ void __SD_task_really_run(SD_task_t task) if (SD_workstation_get_access_mode(task->workstation_list[i]) == SD_WORKSTATION_SEQUENTIAL_ACCESS) { task->workstation_list[i]->current_task = task; - xbt_assert0(__SD_workstation_is_busy(task->workstation_list[i]), + xbt_assert(__SD_workstation_is_busy(task->workstation_list[i]), "The workstation should be busy now"); } } @@ -966,7 +1055,7 @@ void __SD_task_really_run(SD_task_t task) __SD_task_destroy_scheduling_data(task); /* now the scheduling data are not useful anymore */ __SD_task_set_state(task, SD_RUNNING); - xbt_assert2(__SD_task_is_running(task), "Bad state of task '%s': %d", + xbt_assert(__SD_task_is_running(task), "Bad state of task '%s': %d", SD_task_get_name(task), SD_task_get_state(task)); } @@ -985,8 +1074,8 @@ int __SD_task_try_to_run(SD_task_t task) SD_workstation_t workstation; SD_CHECK_INIT_DONE(); - xbt_assert0(task != NULL, "Invalid parameter"); - xbt_assert2(__SD_task_is_runnable(task), + 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)); @@ -1009,7 +1098,7 @@ int __SD_task_try_to_run(SD_task_t task) } } __SD_task_set_state(task, SD_IN_FIFO); - xbt_assert2(__SD_task_is_in_fifo(task), "Bad state of task '%s': %d", + xbt_assert(__SD_task_is_in_fifo(task), "Bad state of task '%s': %d", SD_task_get_name(task), SD_task_get_state(task)); XBT_DEBUG("Task '%s' state is now SD_IN_FIFO", SD_task_get_name(task)); } else { @@ -1035,11 +1124,11 @@ void __SD_task_just_done(SD_task_t task) int can_start = 1; SD_CHECK_INIT_DONE(); - xbt_assert0(task != NULL, "Invalid parameter"); - xbt_assert1(__SD_task_is_running(task), + 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)); - xbt_assert1(task->workstation_list != NULL, + xbt_assert(task->workstation_list != NULL, "Task '%s': workstation_list is NULL!", SD_task_get_name(task)); @@ -1059,10 +1148,10 @@ void __SD_task_just_done(SD_task_t task) XBT_DEBUG("Workstation '%s': access_mode = %d", SD_workstation_get_name(workstation), workstation->access_mode); if (workstation->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS) { - xbt_assert1(workstation->task_fifo != NULL, + xbt_assert(workstation->task_fifo != NULL, "Workstation '%s' has sequential access but no fifo!", SD_workstation_get_name(workstation)); - xbt_assert2(workstation->current_task = + xbt_assert(workstation->current_task = task, "Workstation '%s': current task should be '%s'", SD_workstation_get_name(workstation), SD_task_get_name(task)); @@ -1077,7 +1166,7 @@ void __SD_task_just_done(SD_task_t task) if (candidate != NULL) { XBT_DEBUG("Candidate: '%s'", SD_task_get_name(candidate)); - xbt_assert2(__SD_task_is_in_fifo(candidate), + xbt_assert(__SD_task_is_in_fifo(candidate), "Bad state of candidate '%s': %d", SD_task_get_name(candidate), SD_task_get_state(candidate)); @@ -1117,7 +1206,7 @@ void __SD_task_just_done(SD_task_t task) continue; /* we have already evaluated that task */ } - xbt_assert2(__SD_task_is_in_fifo(candidate), + xbt_assert(__SD_task_is_in_fifo(candidate), "Bad state of candidate '%s': %d", SD_task_get_name(candidate), SD_task_get_state(candidate)); @@ -1146,7 +1235,7 @@ void __SD_task_just_done(SD_task_t task) XBT_DEBUG("Head of the fifo: '%s'", (candidate != NULL) ? SD_task_get_name(candidate) : "NULL"); - xbt_assert0(candidate == candidates[i], + xbt_assert(candidate == candidates[i], "Error in __SD_task_just_done: bad first task in the fifo"); } } /* for each workstation */ @@ -1160,7 +1249,7 @@ void __SD_task_just_done(SD_task_t task) ("Calling __SD_task_is_running: task '%s', state set: %p, running_task_set: %p, is running: %d", SD_task_get_name(candidate), candidate->state_set, sd_global->running_task_set, __SD_task_is_running(candidate)); - xbt_assert2(__SD_task_is_running(candidate), + xbt_assert(__SD_task_is_running(candidate), "Bad state of task '%s': %d", SD_task_get_name(candidate), SD_task_get_state(candidate)); @@ -1202,7 +1291,7 @@ 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_assert0(task != NULL, "Invalid parameter"); + xbt_assert(task != NULL, "Invalid parameter"); if (task->surf_action) return surf_workstation_model-> action_get_start_time(task->surf_action); @@ -1224,7 +1313,7 @@ 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_assert0(task != NULL, "Invalid parameter"); + 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-> @@ -1233,56 +1322,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_assert0(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); - - 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) @@ -1358,20 +1397,20 @@ void SD_task_schedulev(SD_task_t task, int count, int i; SD_dependency_t dep; unsigned int cpt; - xbt_assert1(task->kind != 0, + xbt_assert(task->kind != 0, "Task %s is not typed. Cannot automatically schedule it.", SD_task_get_name(task)); switch (task->kind) { case SD_TASK_COMM_E2E: case SD_TASK_COMP_SEQ: - xbt_assert(task->workstation_nb == count); + xbt_assert(task->workstation_nb == count,"Got %d locations, but were expecting %d locations",count,task->workstation_nb); for (i = 0; i < count; i++) task->workstation_list[i] = list[i]; SD_task_do_schedule(task); break; default: - xbt_die(bprintf("Kind of task %s not supported by SD_task_schedulev()", - SD_task_get_name(task))); + xbt_die("Kind of task %s not supported by SD_task_schedulev()", + SD_task_get_name(task)); } if (task->kind == SD_TASK_COMM_E2E) { XBT_VERB("Schedule comm task %s between %s -> %s. It costs %.f bytes",