+/**
+ * \brief Returns the state of a task
+ *
+ * \param task a task
+ * \return the current \ref e_SD_task_state_t "state" of this task:
+ * #SD_NOT_SCHEDULED, #SD_SCHEDULED, #SD_READY, #SD_RUNNING, #SD_DONE or #SD_FAILED
+ * \see e_SD_task_state_t
+ */
+e_SD_task_state_t SD_task_get_state(SD_task_t task) {
+ SD_CHECK_INIT_DONE();
+ xbt_assert0(task != NULL, "Invalid parameter");
+
+ if (task->state_set == sd_global->scheduled_task_set)
+ return SD_SCHEDULED;
+ if (task->state_set == sd_global->done_task_set)
+ return SD_DONE;
+ if (task->state_set == sd_global->running_task_set)
+ return SD_RUNNING;
+ if (task->state_set == sd_global->ready_task_set)
+ return SD_READY;
+ if (task->state_set == sd_global->not_scheduled_task_set)
+ return SD_NOT_SCHEDULED;
+ return SD_FAILED;
+}
+
+/* Changes the state of a task. Updates the swags and the flag sd_global->watch_point_reached.
+ */
+void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) {
+ xbt_swag_remove(task, task->state_set);
+ switch (new_state) {
+ case SD_NOT_SCHEDULED:
+ task->state_set = sd_global->not_scheduled_task_set;
+ break;
+ case SD_SCHEDULED:
+ task->state_set = sd_global->scheduled_task_set;
+ break;
+ case SD_READY:
+ task->state_set = sd_global->ready_task_set;
+ break;
+ case SD_RUNNING:
+ task->state_set = sd_global->running_task_set;
+ break;
+ case SD_DONE:
+ task->state_set = sd_global->done_task_set;
+ break;
+ case SD_FAILED:
+ task->state_set = sd_global->failed_task_set;
+ break;
+ default:
+ xbt_assert0(0, "Invalid state");
+ }
+ xbt_swag_insert(task, task->state_set);
+
+ if (task->watch_points & new_state) {
+ INFO1("Watch point reached with task '%s'!", SD_task_get_name(task));
+ sd_global->watch_point_reached = 1;
+ SD_task_unwatch(task, new_state); /* remove the watch point */
+ }
+}
+
+/**
+ * \brief Returns the name of a task
+ *
+ * \param task a task
+ * \return the name of this task (can be \c NULL)