X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/85c342932c60954a7e1c9430742bfff2b28c31a8..7a3c75a5b6950753297d8ad174d35b7728270b87:/src/simdag/sd_task.c diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index fc156666b9..9fd8b60598 100644 --- a/src/simdag/sd_task.c +++ b/src/simdag/sd_task.c @@ -91,7 +91,7 @@ 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); + task->category = NULL; #endif return task; @@ -131,7 +131,7 @@ void SD_task_destroy(SD_task_t task) sd_global->task_number--; #ifdef HAVE_TRACING - TRACE_sd_task_destroy(task); + if (task->category) xbt_free(task->category); #endif XBT_DEBUG("Task destroyed."); @@ -372,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)); @@ -447,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) @@ -500,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 @@ -877,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)); @@ -979,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)); } @@ -998,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++) { @@ -1020,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); @@ -1046,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)); @@ -1065,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!", @@ -1088,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); @@ -1127,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]; @@ -1161,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 @@ -1171,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 */ @@ -1188,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); } @@ -1400,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 +}