X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f3a6ed3541c05cff15e5634721f1029f8b28e7e2..7a3c75a5b6950753297d8ad174d35b7728270b87:/src/simdag/sd_task.c diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index bc6d454bbc..9fd8b60598 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 + task->category = NULL; +#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 + if (task->category) xbt_free(task->category); +#endif + XBT_DEBUG("Task destroyed."); } - /** * \brief Returns the user data of a task * @@ -397,14 +372,14 @@ void SD_task_dump(SD_task_t task) } } XBT_INFO(" - amount: %.0f", SD_task_get_amount(task)); - XBT_INFO(" - Dependencies to satisfy: %d", task->unsatisfied_dependencies); - if (xbt_dynar_length(task->tasks_before)) { + XBT_INFO(" - Dependencies to satisfy: %u", task->unsatisfied_dependencies); + if (!xbt_dynar_is_empty(task->tasks_before)) { XBT_INFO(" - pre-dependencies:"); xbt_dynar_foreach(task->tasks_before, counter, dependency) { XBT_INFO(" %s", SD_task_get_name(dependency->src)); } } - if (xbt_dynar_length(task->tasks_after)) { + if (!xbt_dynar_is_empty(task->tasks_after)) { XBT_INFO(" - post-dependencies:"); xbt_dynar_foreach(task->tasks_after, counter, dependency) { XBT_INFO(" %s", SD_task_get_name(dependency->dst)); @@ -438,8 +413,7 @@ void SD_task_dotty(SD_task_t task, void *out) */ static void __SD_task_dependency_destroy(void *dependency) { - if (((SD_dependency_t) dependency)->name != NULL) - xbt_free(((SD_dependency_t) dependency)->name); + xbt_free(((SD_dependency_t)dependency)->name); xbt_free(dependency); } @@ -473,9 +447,10 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src, SD_task_get_name(src)); if (!__SD_task_is_not_scheduled(src) && !__SD_task_is_schedulable(src) - && !__SD_task_is_scheduled_or_runnable(src)) + && !__SD_task_is_scheduled_or_runnable(src) && !__SD_task_is_running(src)) THROWF(arg_error, 0, - "Task '%s' must be SD_NOT_SCHEDULED, SD_SCHEDULABLE, SD_SCHEDULED or SD_RUNNABLE", + "Task '%s' must be SD_NOT_SCHEDULED, SD_SCHEDULABLE, SD_SCHEDULED or SD_RUNNABLE" + " or SD_RUNNING", SD_task_get_name(src)); if (!__SD_task_is_not_scheduled(dst) && !__SD_task_is_schedulable(dst) @@ -526,7 +501,7 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src, } /** - * \brief Indacates whether there is a dependency between two tasks. + * \brief Indicates whether there is a dependency between two tasks. * * \param src a task * \param dst a task depending on \a src @@ -903,7 +878,7 @@ void __SD_task_really_run(SD_task_t task) 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)); + SD_task_get_name(task), (int)SD_task_get_state(task)); xbt_assert(task->workstation_list != NULL, "Task '%s': workstation_list is NULL!", SD_task_get_name(task)); @@ -1005,7 +980,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_assert(__SD_task_is_running(task), "Bad state of task '%s': %d", - SD_task_get_name(task), SD_task_get_state(task)); + SD_task_get_name(task), (int)SD_task_get_state(task)); } @@ -1024,7 +999,7 @@ int __SD_task_try_to_run(SD_task_t task) 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)); + SD_task_get_name(task), (int)SD_task_get_state(task)); for (i = 0; i < task->workstation_nb; i++) { @@ -1046,7 +1021,7 @@ int __SD_task_try_to_run(SD_task_t task) } __SD_task_set_state(task, SD_IN_FIFO); xbt_assert(__SD_task_is_in_fifo(task), "Bad state of task '%s': %d", - SD_task_get_name(task), SD_task_get_state(task)); + SD_task_get_name(task), (int)SD_task_get_state(task)); XBT_DEBUG("Task '%s' state is now SD_IN_FIFO", SD_task_get_name(task)); } else { __SD_task_really_run(task); @@ -1072,7 +1047,7 @@ void __SD_task_just_done(SD_task_t task) xbt_assert(__SD_task_is_running(task), "The task must be running! Task state: %d", - SD_task_get_state(task)); + (int)SD_task_get_state(task)); xbt_assert(task->workstation_list != NULL, "Task '%s': workstation_list is NULL!", SD_task_get_name(task)); @@ -1091,7 +1066,7 @@ void __SD_task_just_done(SD_task_t task) for (i = 0; i < task->workstation_nb; i++) { workstation = task->workstation_list[i]; XBT_DEBUG("Workstation '%s': access_mode = %d", - SD_workstation_get_name(workstation), workstation->access_mode); + SD_workstation_get_name(workstation), (int)workstation->access_mode); if (workstation->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS) { xbt_assert(workstation->task_fifo != NULL, "Workstation '%s' has sequential access but no fifo!", @@ -1114,7 +1089,7 @@ void __SD_task_just_done(SD_task_t task) xbt_assert(__SD_task_is_in_fifo(candidate), "Bad state of candidate '%s': %d", SD_task_get_name(candidate), - SD_task_get_state(candidate)); + (int)SD_task_get_state(candidate)); } XBT_DEBUG("Candidate in fifo: %p", candidate); @@ -1153,7 +1128,7 @@ void __SD_task_just_done(SD_task_t task) xbt_assert(__SD_task_is_in_fifo(candidate), "Bad state of candidate '%s': %d", - SD_task_get_name(candidate), SD_task_get_state(candidate)); + SD_task_get_name(candidate), (int)SD_task_get_state(candidate)); for (j = 0; j < candidate->workstation_nb && can_start; j++) { workstation = candidate->workstation_list[j]; @@ -1187,7 +1162,7 @@ void __SD_task_just_done(SD_task_t task) /* finally execute the task */ XBT_DEBUG("Task '%s' state: %d", SD_task_get_name(candidate), - SD_task_get_state(candidate)); + (int)SD_task_get_state(candidate)); __SD_task_really_run(candidate); XBT_DEBUG @@ -1197,7 +1172,7 @@ void __SD_task_just_done(SD_task_t task) xbt_assert(__SD_task_is_running(candidate), "Bad state of task '%s': %d", SD_task_get_name(candidate), - SD_task_get_state(candidate)); + (int)SD_task_get_state(candidate)); XBT_DEBUG("Okay, the task is running."); } /* can start */ @@ -1214,12 +1189,12 @@ static void __SD_task_remove_dependencies(SD_task_t task) /* we must destroy the dependencies carefuly (with SD_dependency_remove) because each one is stored twice */ SD_dependency_t dependency; - while (xbt_dynar_length(task->tasks_before) > 0) { + while (!xbt_dynar_is_empty(task->tasks_before)) { xbt_dynar_get_cpy(task->tasks_before, 0, &dependency); SD_task_dependency_remove(dependency->src, dependency->dst); } - while (xbt_dynar_length(task->tasks_after) > 0) { + while (!xbt_dynar_is_empty(task->tasks_after)) { xbt_dynar_get_cpy(task->tasks_after, 0, &dependency); SD_task_dependency_remove(dependency->src, dependency->dst); } @@ -1426,3 +1401,50 @@ void SD_task_schedulel(SD_task_t task, int count, ...) SD_task_schedulev(task, count, list); free(list); } + +/** + * \brief Sets the tracing category of a task. + * + * This function should be called after the creation of a + * SimDAG task, to define the category of that task. The first + * parameter must contain a task that was created with the + * function #SD_task_create. The second parameter must contain + * a category that was previously declared with the function + * #TRACE_category. + * + * \param task The task to be considered + * \param category the name of the category to be associated to the task + * + * \see SD_task_get_category, TRACE_category, TRACE_category_with_color + */ +void SD_task_set_category (SD_task_t task, const char *category) +{ +#ifdef HAVE_TRACING + if (!TRACE_is_enabled()) return; + if (task == NULL) return; + if (category == NULL){ + if (task->category) xbt_free (task->category); + task->category = NULL; + }else{ + task->category = xbt_strdup (category); + } +#endif +} + +/** + * \brief Gets the current tracing category of a task. + * + * \param task The task to be considered + * + * \see SD_task_set_category + * + * \return Returns the name of the tracing category of the given task, NULL otherwise + */ +const char *SD_task_get_category (SD_task_t task) +{ +#ifdef HAVE_TRACING + return task->category; +#else + return NULL; +#endif +}