+ task->watch_points = task->watch_points & ~state;
+ /* __SD_print_watch_points(task);*/
+}
+
+/* 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);
+}
+
+/**
+ * \brief Schedules a task
+ *
+ * The task state must be #SD_NOT_SCHEDULED.
+ * Once scheduled, a task will be executed as soon as possible in SD_simulate(),
+ * i.e. when its dependencies are satisfied.
+ *
+ * \param task the task you want to schedule
+ * \param workstation_nb number of workstations on which the task will be executed
+ * \param workstation_list the workstations on which the task will be executed
+ * \param computation_amount computation amount for each workstation
+ * \param communication_amount communication amount between each pair of workstations
+ * \param rate task execution speed rate
+ * \see SD_task_unschedule()
+ */
+void SD_task_schedule(SD_task_t task, int workstation_nb,
+ const SD_workstation_t *workstation_list, double *computation_amount,
+ double *communication_amount, double rate) {
+ SD_CHECK_INIT_DONE();
+ xbt_assert0(task, "Invalid parameter");
+ 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);