2 #include "simdag/simdag.h"
3 #include "xbt/sysdep.h"
7 SD_task_t SD_task_create(const char *name, void *data, double amount) {
9 xbt_assert0(name != NULL, "name is NULL !");
10 xbt_assert0(amount > 0, "amount must be positive");
12 SD_task_data_t sd_data = xbt_new0(s_SD_task_data_t, 1); /* task private data */
13 sd_data->name = xbt_strdup(name);
14 sd_data->state = SD_NOT_SCHEDULED;
15 sd_data->amount = amount;
16 sd_data->surf_action = NULL;
17 sd_data->watch_points = 0;
19 SD_task_t task = xbt_new0(s_SD_task_t, 1);
20 task->sd_data = sd_data; /* private data */
21 task->data = data; /* user data */
23 /* TODO: dependencies */
30 int SD_task_schedule(SD_task_t task, int workstation_nb,
31 SD_workstation_t **workstation_list, double *computation_amount,
32 double *communication_amount, double rate) {
34 xbt_assert0(task, "Invalid parameter");
40 /* Returns the data of a task.
42 void* SD_task_get_data(SD_task_t task) {
44 xbt_assert0(task, "Invalid parameter");
48 /* Sets the data of a task.
50 void SD_task_set_data(SD_task_t task, void *data) {
52 xbt_assert0(task, "Invalid parameter");
56 /* Returns the name of a task.
58 const char* SD_task_get_name(SD_task_t task) {
60 xbt_assert0(task, "Invalid parameter");
61 return task->sd_data->name;
64 /* Returns the computing amount of a task.
66 double SD_task_get_amount(SD_task_t task) {
68 xbt_assert0(task, "Invalid parameter");
69 return task->sd_data->amount;
72 /* Returns the remaining computing amount of a task.
74 double SD_task_get_remaining_amount(SD_task_t task) {
76 xbt_assert0(task, "Invalid parameter");
77 SD_task_data_t sd_data = task->sd_data;
78 if (sd_data->surf_action == NULL)
79 return sd_data->amount;
81 return sd_data->surf_action->remains;
84 /* Adds a dependency between two tasks.
86 void SD_task_dependency_add(const char *name, void *data, SD_task_t src, SD_task_t dst) {
88 xbt_assert0(src != NULL && dst != NULL, "Invalid parameter");
92 /* Removes a dependency between two tasks.
94 void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) {
96 xbt_assert0(src != NULL && dst != NULL, "Invalid parameter");
100 /* Returns the state of a task: SD_NOT_SCHEDULED, SD_SCHEDULED, SD_RUNNING, SD_DONE or SD_FAILED.
102 SD_task_state_t SD_task_get_state(SD_task_t task) {
104 xbt_assert0(task, "Invalid parameter");
105 return task->sd_data->state;
108 /* temporary function for debugging */
109 void __SD_print_watch_points(SD_task_t task) {
110 static const int state_masks[] = {SD_SCHEDULED, SD_RUNNING, SD_DONE, SD_FAILED};
111 static const char* state_names[] = {"scheduled", "running", "done", "failed"};
113 printf("Task '%s' watch points (%x): ", task->sd_data->name, task->sd_data->watch_points);
116 for (i = 0; i < 4; i++) {
117 if (task->sd_data->watch_points & state_masks[i])
118 printf("%s ", state_names[i]);
124 /* Adds a watch point to a task.
125 SD_simulate will stop as soon as the state of this task is the one given in argument.
126 Watch point is then automatically removed.
128 void SD_task_watch(SD_task_t task, SD_task_state_t state) {
130 xbt_assert0(task, "Invalid parameter");
132 task->sd_data->watch_points = task->sd_data->watch_points | state;
133 __SD_print_watch_points(task);
136 /* Removes a watch point from a task.
138 void SD_task_unwatch(SD_task_t task, SD_task_state_t state) {
140 xbt_assert0(task, "Invalid parameter");
142 task->sd_data->watch_points = task->sd_data->watch_points & ~state;
143 __SD_print_watch_points(task);
146 /* Unschedules a task.
147 Change state and rerun
149 void SD_task_unschedule(SD_task_t task) {
151 xbt_assert0(task, "Invalid parameter");
155 /* Destroys a task. The user data (if any) should have been destroyed first.
157 void SD_task_destroy(SD_task_t task) {
159 xbt_free(task->sd_data->name);
160 xbt_free(task->sd_data);
161 /* TODO: dependencies */