xbt_dynar_t. This function was in handling a dynar internally and
converted it into a NULL terminated array for historical reasons.
* Rename the SD_READY (all dependencies are satisfied and task is
- scheduled) state in SD_RUNNABLE. This prevents a confusion with
- the notion of "ready" used in DAG scheduling (all dependencies are
- satisfied)
-
+ scheduled) state in SD_RUNNABLE and define a new SD_READY (all
+ dependencies are satisfied) state.
+ This prevents a confusion between the notion of "ready to schedule"
+ (SD_READY) used in DAG scheduling and that of "ready to be
+ simulated" (SD_RUNNABLE) used by the simulation kernel.
+
XBT
* New data container: setset (set of sets of elements)
* New module: mmalloc (mapped malloc)
@see SD_task_management */
typedef enum {
SD_NOT_SCHEDULED = 0, /**< @brief Initial state (not valid for SD_watch and SD_unwatch). */
- SD_SCHEDULED = 0x0001, /**< @brief A task becomes SD_SCHEDULED when you call function
- SD_task_schedule. SD_simulate will execute it when it becomes SD_RUNNABLE. */
- SD_RUNNABLE = 0x0002, /**< @brief A scheduled task becomes runnable is SD_simulate as soon as its dependencies are satisfied. */
- SD_IN_FIFO = 0x0004, /**< @brief A runnable task can have to wait in a workstation fifo if the workstation is sequential */
- SD_RUNNING = 0x0008, /**< @brief An SD_RUNNABLE or SD_IN_FIFO becomes SD_RUNNING when it is launched. */
- SD_DONE = 0x0010, /**< @brief The task is successfully finished. */
- SD_FAILED = 0x0020 /**< @brief A problem occurred during the execution of the task. */
+ SD_READY = 0x0001, /**< @brief A task becomes SD_READY as soon as its dependencies are satisfied */
+ SD_SCHEDULED = 0x0002, /**< @brief A task becomes SD_SCHEDULED when you call function
+ SD_task_schedule. SD_simulate will execute it when it becomes SD_RUNNABLE. */
+ SD_RUNNABLE = 0x0004, /**< @brief A scheduled task becomes runnable is SD_simulate as soon as its dependencies are satisfied. */
+ SD_IN_FIFO = 0x0008, /**< @brief A runnable task can have to wait in a workstation fifo if the workstation is sequential */
+ SD_RUNNING = 0x0010, /**< @brief An SD_RUNNABLE or SD_IN_FIFO becomes SD_RUNNING when it is launched. */
+ SD_DONE = 0x0020, /**< @brief The task is successfully finished. */
+ SD_FAILED = 0x0040 /**< @brief A problem occurred during the execution of the task. */
} e_SD_task_state_t;
/** @brief Task kinds
/* task state sets */
xbt_swag_t not_scheduled_task_set;
+ xbt_swag_t ready_task_set;
xbt_swag_t scheduled_task_set;
xbt_swag_t runnable_task_set;
xbt_swag_t in_fifo_task_set;
return task->state_set == sd_global->not_scheduled_task_set;
}
+/* Returns whether the state of the given task is SD_SCHEDULED. */
+static XBT_INLINE int __SD_task_is_ready(SD_task_t task)
+{
+ return task->state_set == sd_global->ready_task_set;
+}
+
/* Returns whether the state of the given task is SD_SCHEDULED. */
static XBT_INLINE int __SD_task_is_scheduled(SD_task_t task)
{
files=xbt_dict_new();
jobs=xbt_dict_new();
root_task = SD_task_create_comp_seq("root",NULL,0);
+ /* by design the root task is always READY */
+ __SD_task_set_state(root_task, SD_READY);
+
xbt_dynar_push(result,&root_task);
end_task = SD_task_create_comp_seq("end",NULL,0);
sd_global->not_scheduled_task_set =
xbt_swag_new(xbt_swag_offset(task, state_hookup));
- sd_global->scheduled_task_set =
+ sd_global->ready_task_set =
xbt_swag_new(xbt_swag_offset(task, state_hookup));
+ sd_global->scheduled_task_set =
+ xbt_swag_new(xbt_swag_offset(task, state_hookup));
sd_global->runnable_task_set =
xbt_swag_new(xbt_swag_offset(task, state_hookup));
sd_global->in_fifo_task_set =
if (SD_INITIALISED()) {
DEBUG0("Recreating the swags...");
xbt_swag_free(sd_global->not_scheduled_task_set);
+ xbt_swag_free(sd_global->ready_task_set);
xbt_swag_free(sd_global->scheduled_task_set);
xbt_swag_free(sd_global->runnable_task_set);
xbt_swag_free(sd_global->in_fifo_task_set);
sd_global->not_scheduled_task_set =
xbt_swag_new(xbt_swag_offset(task, state_hookup));
+ sd_global->ready_task_set =
+ xbt_swag_new(xbt_swag_offset(task, state_hookup));
sd_global->scheduled_task_set =
xbt_swag_new(xbt_swag_offset(task, state_hookup));
sd_global->runnable_task_set =
if (dst->unsatisfied_dependencies>0)
dst->unsatisfied_dependencies--;
- if (!(dst->unsatisfied_dependencies) && __SD_task_is_scheduled(dst))
- __SD_task_set_state(dst, SD_RUNNABLE);
+ if (!(dst->unsatisfied_dependencies)){
+ if (__SD_task_is_scheduled(dst))
+ __SD_task_set_state(dst, SD_RUNNABLE);
+ else
+ __SD_task_set_state(dst, SD_READY);
+ }
/* is dst runnable now? */
if (__SD_task_is_runnable(dst) && !sd_global->watch_point_reached) {
DEBUG0("Destroying the swags...");
xbt_swag_free(sd_global->not_scheduled_task_set);
+ xbt_swag_free(sd_global->ready_task_set);
xbt_swag_free(sd_global->scheduled_task_set);
xbt_swag_free(sd_global->runnable_task_set);
xbt_swag_free(sd_global->in_fifo_task_set);
case SD_NOT_SCHEDULED:
task->state_set = sd_global->not_scheduled_task_set;
break;
+ case SD_READY:
+ task->state_set = sd_global->ready_task_set;
+ break;
case SD_SCHEDULED:
task->state_set = sd_global->scheduled_task_set;
break;
INFO1("Displaying task %s",SD_task_get_name(task));
statename=bprintf("%s %s %s %s %s %s %s",
(task->state&SD_NOT_SCHEDULED?"not scheduled":""),
+ (task->state&SD_READY?"ready":""),
(task->state&SD_SCHEDULED?"scheduled":""),
(task->state&SD_RUNNABLE?"runnable":"not runnable"),
(task->state&SD_IN_FIFO?"in fifo":""),
"Cannot add a dependency between task '%s' and itself",
SD_task_get_name(src));
- if (!__SD_task_is_not_scheduled(src)
+ if (!__SD_task_is_not_scheduled(src) && !__SD_task_is_ready(src)
&& !__SD_task_is_scheduled_or_runnable(src))
THROW1(arg_error, 0,
- "Task '%s' must be SD_NOT_SCHEDULED, SD_SCHEDULED or SD_RUNNABLE",
+ "Task '%s' must be SD_NOT_SCHEDULED, SD_READY, SD_SCHEDULED or SD_RUNNABLE",
SD_task_get_name(src));
- if (!__SD_task_is_not_scheduled(dst)
+ if (!__SD_task_is_not_scheduled(dst) && !__SD_task_is_ready(dst)
&& !__SD_task_is_scheduled_or_runnable(dst))
THROW1(arg_error, 0,
- "Task '%s' must be SD_NOT_SCHEDULED, SD_SCHEDULED or SD_RUNNABLE",
+ "Task '%s' must be SD_NOT_SCHEDULED, SD_READY, SD_SCHEDULED or SD_RUNNABLE",
SD_task_get_name(dst));
DEBUG2("SD_task_dependency_add: src = %s, dst = %s", SD_task_get_name(src),
/* if the task was scheduled and dst->tasks_before is empty now, we can make it runnable */
- if (dst->unsatisfied_dependencies == 0 && __SD_task_is_scheduled(dst))
- __SD_task_set_state(dst, SD_RUNNABLE);
-
+ if (dst->unsatisfied_dependencies == 0){
+ if (__SD_task_is_scheduled(dst))
+ __SD_task_set_state(dst, SD_RUNNABLE);
+ else
+ __SD_task_set_state(dst, SD_READY);
+ }
/* __SD_print_dependencies(src);
__SD_print_dependencies(dst); */
}
static void __SD_print_watch_points(SD_task_t task)
{
static const int state_masks[] =
- { SD_SCHEDULED, SD_RUNNING, SD_RUNNABLE, SD_DONE, SD_FAILED };
+ { SD_READY, SD_SCHEDULED, SD_RUNNING, SD_RUNNABLE, SD_DONE, SD_FAILED };
static const char *state_names[] =
- { "scheduled", "running", "runnable", "done", "failed" };
+ { "ready", "scheduled", "running", "runnable", "done", "failed" };
int i;
INFO2("Task '%s' watch points (%x): ", SD_task_get_name(task),
if (__SD_task_is_running(task)) /* the task should become SD_FAILED */
surf_workstation_model->action_cancel(task->surf_action);
- else
- __SD_task_set_state(task, SD_NOT_SCHEDULED);
+ else {
+ if (task->unsatisfied_dependencies == 0)
+ __SD_task_set_state(task, SD_READY);
+ else
+ __SD_task_set_state(task, SD_NOT_SCHEDULED);
+ }
task->remains = task->amount;
task->start_time = -1.0;
}