+ xbt_assert1(src != dst, "Cannot add a dependency between task '%s' and itself", SD_task_get_name(src));
+ xbt_assert1(__SD_task_is_not_scheduled(src) || __SD_task_is_scheduled_or_ready(src),
+ "Task '%s' must be SD_NOT_SCHEDULED, SD_SCHEDULED or SD_READY", SD_task_get_name(src));
+ xbt_assert1(__SD_task_is_not_scheduled(dst) || __SD_task_is_scheduled_or_ready(dst),
+ "Task '%s' must be SD_NOT_SCHEDULED, SD_SCHEDULED or SD_READY", SD_task_get_name(dst));
+
+ xbt_dynar_t dynar = src->tasks_after;
+ int length = xbt_dynar_length(dynar);
+ int found = 0;
+ int i;
+ SD_dependency_t dependency;
+ for (i = 0; i < length && !found; i++) {
+ xbt_dynar_get_cpy(dynar, i, &dependency);
+ found = (dependency->dst == dst);
+ }
+ xbt_assert2(!found, "A dependency already exists between task '%s' and task '%s'",
+ SD_task_get_name(src), SD_task_get_name(dst));
+
+ dependency = xbt_new0(s_SD_dependency_t, 1);
+
+ if (name != NULL)
+ dependency->name = xbt_strdup(name);
+ dependency->data = data;
+ dependency->src = src;
+ dependency->dst = dst;
+
+ /* src must be executed before dst */
+ xbt_dynar_push(src->tasks_after, &dependency);
+ xbt_dynar_push(dst->tasks_before, &dependency);
+
+ /* if the task was ready, then dst->tasks_before is not empty anymore,
+ so we must go back to state SD_SCHEDULED */
+ if (__SD_task_is_ready(dst)) {
+ DEBUG1("SD_task_dependency_add: %s was ready and becomes scheduled!", SD_task_get_name(dst));
+ __SD_task_set_state(dst, SD_SCHEDULED);
+ }
+
+ /* __SD_print_dependencies(src);
+ __SD_print_dependencies(dst); */