+static XBT_INLINE SD_task_t SD_task_create_sized(const char *name,
+ void *data, double amount,
+ int ws_count)
+{
+ SD_task_t task = SD_task_create(name, data, amount);
+ task->communication_amount = xbt_new0(double, ws_count * ws_count);
+ task->computation_amount = xbt_new0(double, ws_count);
+ task->workstation_nb = ws_count;
+ task->workstation_list = xbt_new0(SD_workstation_t, ws_count);
+ return task;
+}
+
+/** @brief create a end-to-end communication task that can then be auto-scheduled
+ *
+ * Auto-scheduling mean that the task can be used with SD_task_schedulev(). This
+ * allows to specify the task costs at creation, and decouple them from the
+ * scheduling process where you just specify which resource should deliver the
+ * mandatory power.
+ *
+ * A end-to-end communication must be scheduled on 2 hosts, and the amount
+ * specified at creation is sent from hosts[0] to hosts[1].
+ */
+SD_task_t SD_task_create_comm_e2e(const char *name, void *data,
+ double amount)
+{
+ SD_task_t res = SD_task_create_sized(name, data, amount, 2);
+ res->communication_amount[2] = amount;
+ res->kind = SD_TASK_COMM_E2E;
+ return res;
+}
+
+/** @brief create a sequential computation task that can then be auto-scheduled
+ *
+ * Auto-scheduling mean that the task can be used with SD_task_schedulev(). This
+ * allows to specify the task costs at creation, and decouple them from the
+ * scheduling process where you just specify which resource should deliver the
+ * mandatory power.
+ *
+ * A sequential computation must be scheduled on 1 host, and the amount
+ * specified at creation to be run on hosts[0].
+ *
+ * \param name the name of the task (can be \c NULL)
+ * \param data the user data you want to associate with the task (can be \c NULL)
+ * \param amount amount of compute work to be done by the task
+ * \return the new SD_TASK_COMP_SEQ typed task
+ */
+SD_task_t SD_task_create_comp_seq(const char *name, void *data,
+ double amount)
+{
+ SD_task_t res = SD_task_create_sized(name, data, amount, 1);
+ res->computation_amount[0] = amount;
+ res->kind = SD_TASK_COMP_SEQ;
+ return res;
+}
+
+/** @brief create a parallel computation task that can then be auto-scheduled
+ *
+ * Auto-scheduling mean that the task can be used with SD_task_schedulev(). This
+ * allows to specify the task costs at creation, and decouple them from the
+ * scheduling process where you just specify which resource should deliver the
+ * mandatory power.
+ *
+ * A parallel computation can be scheduled on any number of host.
+ * The underlying speedup model is Amdahl's law.
+ * To be auto-scheduled, \see SD_task_distribute_comp_amdhal has to be called
+ * first.
+ * \param name the name of the task (can be \c NULL)
+ * \param data the user data you want to associate with the task (can be \c NULL)
+ * \param amount amount of compute work to be done by the task
+ * \param purely serial fraction of the work to be done (in [0.;1.[)
+ * \return the new task
+ */
+SD_task_t SD_task_create_comp_par_amdahl(const char *name, void *data,
+ double amount, double alpha)
+{
+ xbt_assert(alpha < 1. && alpha >= 0.,
+ "Invalid parameter: alpha must be in [0.;1.[");
+
+ SD_task_t res = SD_task_create(name, data, amount);
+ res->alpha = alpha;
+ res->kind = SD_TASK_COMP_PAR_AMDAHL;
+ return res;
+}
+
+
+/**
+ * \brief Destroys a task.
+ *
+ * The user data (if any) should have been destroyed first.
+ *
+ * \param task the task you want to destroy
+ * \see SD_task_create()
+ */
+void SD_task_destroy(SD_task_t task)
+{
+ XBT_DEBUG("Destroying task %s...", SD_task_get_name(task));
+
+ __SD_task_remove_dependencies(task);
+ /* if the task was scheduled or runnable we have to free the scheduling parameters */
+ if (__SD_task_is_scheduled_or_runnable(task))
+ __SD_task_destroy_scheduling_data(task);
+ if (task->state_set != NULL) /* would be null if just created */
+ xbt_swag_remove(task, task->state_set);
+
+ xbt_swag_remove(task, sd_global->return_set);
+
+ xbt_free(task->name);
+
+ if (task->surf_action != NULL)
+ surf_workstation_model->action_unref(task->surf_action);
+
+ xbt_free(task->workstation_list);
+ xbt_free(task->communication_amount);
+ xbt_free(task->computation_amount);
+
+ xbt_mallocator_release(sd_global->task_mallocator,task);
+ sd_global->task_number--;
+
+#ifdef HAVE_TRACING
+ if (task->category) xbt_free(task->category);
+#endif
+
+ XBT_DEBUG("Task destroyed.");
+}
+