X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4636dcbf566244aa2c2bff539d0410dae1071c81..b51da37243dc16575499f4cb7729fe8bdd7fa514:/src/simdag/sd_task.cpp diff --git a/src/simdag/sd_task.cpp b/src/simdag/sd_task.cpp index 9b677f8866..33d2b5daa2 100644 --- a/src/simdag/sd_task.cpp +++ b/src/simdag/sd_task.cpp @@ -52,9 +52,6 @@ void SD_task_recycle_f(void *t) task->watch_points = 0; /* dependencies */ - task->unsatisfied_dependencies = 0; - task->is_not_ready = 0; - task->inputs->clear(); task->outputs->clear(); task->predecessors->clear(); @@ -288,7 +285,7 @@ void SD_task_set_data(SD_task_t task, void *data) 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); @@ -313,6 +310,7 @@ e_SD_task_state_t SD_task_get_state(SD_task_t task) void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) { std::set::iterator idx; + XBT_DEBUG("Set state of '%s' to %d", task->name, new_state); switch (new_state) { case SD_NOT_SCHEDULED: case SD_SCHEDULABLE: @@ -324,22 +322,25 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) 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); @@ -347,6 +348,10 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) 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"); @@ -356,7 +361,7 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_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 */ } } @@ -531,13 +536,10 @@ void SD_task_dump(SD_task_t task) } } - 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::iterator it=task->predecessors->begin(); it!=task->predecessors->end(); ++it) @@ -636,9 +638,6 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src, SD_task 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)); @@ -680,7 +679,6 @@ int SD_task_dependency_exists(SD_task_t src, SD_task_t 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() && @@ -688,12 +686,6 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) 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){ @@ -713,15 +705,8 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) } /* 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); } /** @@ -802,7 +787,7 @@ static inline void SD_task_do_schedule(SD_task_t task) 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); @@ -884,7 +869,7 @@ void SD_task_unschedule(SD_task_t task) /* 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); @@ -923,11 +908,9 @@ void SD_task_run(SD_task_t task) 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); } /**