+ xbt_assert1(__SD_task_is_not_scheduled(task), "Task '%s' has already been scheduled.", SD_task_get_name(task));
+ xbt_assert0(workstation_nb > 0, "workstation_nb must be positive");
+
+ task->workstation_nb = workstation_nb;
+ task->rate = rate;
+
+ task->computation_amount = xbt_new0(double, workstation_nb);
+ memcpy(task->computation_amount, computation_amount, sizeof(double) * workstation_nb);
+
+ int communication_nb = workstation_nb * workstation_nb;
+ task->communication_amount = xbt_new0(double, communication_nb);
+ memcpy(task->communication_amount, communication_amount, sizeof(double) * communication_nb);
+
+ /* we have to create a Surf workstation array instead of the SimDag workstation array */
+ task->workstation_list = xbt_new0(void*, workstation_nb);
+ int i;
+ for (i = 0; i < workstation_nb; i++) {
+ task->workstation_list[i] = workstation_list[i]->surf_workstation;
+ }
+
+ /* update the task state */
+ if (xbt_dynar_length(task->tasks_before) == 0)
+ __SD_task_set_state(task, SD_READY);
+ else
+ __SD_task_set_state(task, SD_SCHEDULED);
+}
+
+/**
+ * \brief Unschedules a task
+ *
+ * The task state must be #SD_SCHEDULED, #SD_READY, #SD_RUNNING or #SD_FAILED.
+ * If you call this function, the task state becomes #SD_NOT_SCHEDULED.
+ * Call SD_task_schedule() to schedule it again.
+ *
+ * \param task the task you want to unschedule
+ * \see SD_task_schedule()
+ */
+void SD_task_unschedule(SD_task_t task) {
+ SD_CHECK_INIT_DONE();
+ xbt_assert0(task != NULL, "Invalid parameter");
+ xbt_assert1(task->state_set == sd_global->scheduled_task_set ||
+ task->state_set == sd_global->ready_task_set ||
+ task->state_set == sd_global->running_task_set ||
+ task->state_set == sd_global->failed_task_set,
+ "Task %s: the state must be SD_SCHEDULED, SD_READY, SD_RUNNING or SD_FAILED",
+ SD_task_get_name(task));
+
+ if (__SD_task_is_scheduled_or_ready(task)) /* if the task is scheduled or ready */
+ __SD_task_destroy_scheduling_data(task);
+
+ if (__SD_task_is_running(task)) /* the task should become SD_FAILED */
+ surf_workstation_resource->common_public->action_cancel(task->surf_action);
+ else
+ __SD_task_set_state(task, SD_NOT_SCHEDULED);
+}
+
+/* Destroys the data memorised by SD_task_schedule. Task state must be SD_SCHEDULED or SD_READY.
+ */
+static void __SD_task_destroy_scheduling_data(SD_task_t task) {
+ SD_CHECK_INIT_DONE();
+ xbt_assert1(__SD_task_is_scheduled_or_ready(task),
+ "Task '%s' must be SD_SCHEDULED or SD_READY", SD_task_get_name(task));
+ xbt_free(task->workstation_list);
+ xbt_free(task->computation_amount);
+ xbt_free(task->communication_amount);