Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] better checks on setting cats, if NULL is provided, task is no longer traced
[simgrid.git] / src / simdag / sd_task.c
index 9109ff9..9fd8b60 100644 (file)
@@ -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,7 +372,7 @@ 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);
+  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) {
@@ -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 */
@@ -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
+}