task->watch_points = 0;
/* dependencies */
- task->unsatisfied_dependencies = 0;
- task->is_not_ready = 0;
-
task->inputs->clear();
task->outputs->clear();
task->predecessors->clear();
void SD_task_set_rate(SD_task_t task, double rate)
{
xbt_assert(task->kind == SD_TASK_COMM_E2E, "The rate can be modified for end-to-end communications only.");
- if(task->start_time<0) {
+ if(task->state < SD_RUNNING) {
task->rate = rate;
} else {
XBT_WARN("Task %p has started. Changing rate is ineffective.", task);
void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
{
std::set<SD_task_t>::iterator idx;
+ XBT_DEBUG("Set state of '%s' to %d", task->name, new_state);
switch (new_state) {
case SD_NOT_SCHEDULED:
case SD_SCHEDULABLE:
case SD_SCHEDULED:
if (SD_task_get_state(task) == SD_RUNNABLE){
sd_global->initial_tasks->insert(task);
- sd_global->executable_tasks->erase(task);
+ sd_global->runnable_tasks->erase(task);
}
break;
case SD_RUNNABLE:
idx = sd_global->initial_tasks->find(task);
if (idx != sd_global->initial_tasks->end()) {
- sd_global->executable_tasks->insert(*idx);
+ sd_global->runnable_tasks->insert(*idx);
sd_global->initial_tasks->erase(idx);
}
break;
case SD_RUNNING:
- sd_global->executable_tasks->erase(task);
+ sd_global->runnable_tasks->erase(task);
break;
case SD_DONE:
sd_global->completed_tasks->insert(task);
+ task->start_time = task->surf_action->getStartTime();
task->finish_time = task->surf_action->getFinishTime();
+ task->surf_action->unref();
+ task->surf_action = nullptr;
task->remains = 0;
#if HAVE_JEDULE
jedule_log_sd_event(task);
break;
case SD_FAILED:
sd_global->completed_tasks->insert(task);
+ task->start_time = task->surf_action->getStartTime();
+ task->finish_time = surf_get_clock();
+ task->surf_action->unref();
+ task->surf_action = nullptr;
break;
default:
xbt_die( "Invalid state");
if (task->watch_points & new_state) {
XBT_VERB("Watch point reached with task '%s'!", SD_task_get_name(task));
- sd_global->watch_point_reached = 1;
+ sd_global->watch_point_reached = true;
SD_task_unwatch(task, new_state); /* remove the watch point */
}
}
}
}
- if (task->category)
- XBT_INFO(" - tracing category: %s", task->category);
-
XBT_INFO(" - amount: %.0f", SD_task_get_amount(task));
if (task->kind == SD_TASK_COMP_PAR_AMDAHL)
XBT_INFO(" - alpha: %.2f", task->alpha);
- XBT_INFO(" - Dependencies to satisfy: %d", task->unsatisfied_dependencies);
+ XBT_INFO(" - Dependencies to satisfy: %zu", task->inputs->size()+ task->predecessors->size());
if ((task->inputs->size()+ task->predecessors->size()) > 0) {
XBT_INFO(" - pre-dependencies:");
for (std::set<SD_task_t>::iterator it=task->predecessors->begin(); it!=task->predecessors->end(); ++it)
dst->predecessors->insert(src);
}
- dst->unsatisfied_dependencies++;
- dst->is_not_ready++;
-
/* if the task was runnable, the task goes back to SD_SCHEDULED because of the new dependency*/
if (SD_task_get_state(dst) == SD_RUNNABLE) {
XBT_DEBUG("SD_task_dependency_add: %s was runnable and becomes scheduled!", SD_task_get_name(dst));
*/
void SD_task_dependency_remove(SD_task_t src, SD_task_t dst)
{
-
XBT_DEBUG("SD_task_dependency_remove: src = %s, dst = %s", SD_task_get_name(src), SD_task_get_name(dst));
if (src->successors->find(dst) == src->successors->end() &&
THROWF(arg_error, 0, "No dependency found between task '%s' and '%s': task '%s' is not a successor of task '%s'",
SD_task_get_name(src), SD_task_get_name(dst), SD_task_get_name(dst), SD_task_get_name(src));
- if (dst->predecessors->find(src) != dst->predecessors->end() ||
- dst->inputs->find(src) != dst->inputs->end()){
- dst->unsatisfied_dependencies--;
- dst->is_not_ready--;
- }
-
e_SD_task_kind_t src_kind = SD_task_get_kind(src);
e_SD_task_kind_t dst_kind = SD_task_get_kind(dst);
if (src_kind == SD_TASK_COMM_E2E || src_kind == SD_TASK_COMM_PAR_MXN_1D_BLOCK){
}
/* if the task was scheduled and dependencies are satisfied, we can make it runnable */
- if (dst->unsatisfied_dependencies == 0) {
- if (SD_task_get_state(dst) == SD_SCHEDULED)
- SD_task_set_state(dst, SD_RUNNABLE);
- else
- SD_task_set_state(dst, SD_SCHEDULABLE);
- }
-
- if (dst->is_not_ready == 0)
- SD_task_set_state(dst, SD_SCHEDULABLE);
+ if (dst->predecessors->empty() && dst->inputs->empty() && SD_task_get_state(dst) == SD_SCHEDULED)
+ SD_task_set_state(dst, SD_RUNNABLE);
}
/**
if (SD_task_get_state(task) > SD_SCHEDULABLE)
THROWF(arg_error, 0, "Task '%s' has already been scheduled", SD_task_get_name(task));
- if (task->unsatisfied_dependencies == 0)
+ if (task->predecessors->empty() && task->inputs->empty())
SD_task_set_state(task, SD_RUNNABLE);
else
SD_task_set_state(task, SD_SCHEDULED);
/* the task should become SD_FAILED */
task->surf_action->cancel();
else {
- if (task->unsatisfied_dependencies == 0)
+ if (task->predecessors->empty() && task->inputs->empty())
SD_task_set_state(task, SD_SCHEDULABLE);
else
SD_task_set_state(task, SD_NOT_SCHEDULED);
XBT_DEBUG("surf_action = %p", task->surf_action);
- if (task->category)
- TRACE_surf_action(task->surf_action, task->category);
-
__SD_task_destroy_scheduling_data(task); /* now the scheduling data are not useful anymore */
SD_task_set_state(task, SD_RUNNING);
+ xbt_dynar_push(sd_global->return_set, &task);
}
/**