$ $SG_TEST_EXENV ./typed_tasks/sd_typed_tasks ${srcdir:=.}/../platforms/two_clusters.xml
> [0.000000] [xbt_cfg/INFO] Switching to the L07 model to handle parallel tasks.
-> [2.080600] [sd_typed_tasks_test/INFO] Task 'Seq. comp. 1' start time: 0.000000, finish time: 1.000000
-> [2.080600] [sd_typed_tasks_test/INFO] Task 'Par. Comp. 1' start time: 0.000000, finish time: 0.400000
> [2.080600] [sd_typed_tasks_test/INFO] Task 'Par. Comp. 3' start time: 0.000000, finish time: 0.400000
+> [2.080600] [sd_typed_tasks_test/INFO] Task 'Par. Comp. 1' start time: 0.000000, finish time: 0.400000
+> [2.080600] [sd_typed_tasks_test/INFO] Task 'Seq. comp. 1' start time: 0.000000, finish time: 1.000000
> [2.080600] [sd_typed_tasks_test/INFO] Task 'MxN redist' start time: 0.400000, finish time: 0.721600
> [2.080600] [sd_typed_tasks_test/INFO] Task 'Par. Comp. 2' start time: 0.721600, finish time: 0.921600
> [2.080600] [sd_typed_tasks_test/INFO] Task 'E2E comm.' start time: 1.000000, finish time: 1.080600
SD_task_t file = static_cast<SD_task_t>(xbt_dict_get_or_null(files, A_dax__uses_file));
if (file == nullptr) {
file = SD_task_create_comm_e2e(A_dax__uses_file, nullptr, size);
- sd_global->initial_task_set->pop_back();
+ sd_global->initial_tasks->erase(file);
xbt_dict_set(files, A_dax__uses_file, file, nullptr);
} else {
if (SD_task_get_amount(file) != size) {
sd_global->task_mallocator=xbt_mallocator_new(65536, SD_task_new_f, SD_task_free_f, SD_task_recycle_f);
- sd_global->initial_task_set = new std::vector<SD_task_t>();
- sd_global->executable_task_set = new std::vector<SD_task_t>();
- sd_global->completed_task_set = new std::vector<SD_task_t>();
+ sd_global->initial_tasks = new std::set<SD_task_t>();
+ sd_global->executable_tasks = new std::set<SD_task_t>();
+ sd_global->completed_tasks = new std::set<SD_task_t>();
sd_global->return_set = xbt_dynar_new(sizeof(SD_task_t), nullptr);
surf_init(argc, argv);
xbt_dynar_reset(sd_global->return_set);
/* explore the runnable tasks */
- for (unsigned int i =0; i < sd_global->executable_task_set->size(); i++) {
- task = sd_global->executable_task_set->at(i);
+ for (std::set<SD_task_t>::iterator it=sd_global->executable_tasks->begin();
+ it!=sd_global->executable_tasks->end(); ++it){
+ task = *it;
XBT_VERB("Executing task '%s'", SD_task_get_name(task));
SD_task_run(task);
xbt_dynar_push(sd_global->return_set, &task);
}
}
- if (!sd_global->watch_point_reached && how_long<0 && !sd_global->initial_task_set->empty()) {
+ if (!sd_global->watch_point_reached && how_long<0 && !sd_global->initial_tasks->empty()) {
XBT_WARN("Simulation is finished but %lu tasks are still not done",
- sd_global->initial_task_set->size());
+ sd_global->initial_tasks->size());
static const char* state_names[] =
{ "SD_NOT_SCHEDULED", "SD_SCHEDULABLE", "SD_SCHEDULED", "SD_RUNNABLE", "SD_RUNNING", "SD_DONE","SD_FAILED" };
- for (unsigned int i=0; i< sd_global->initial_task_set->size() ; i++){
- task = sd_global->initial_task_set->at(i);
+ for (std::set<SD_task_t>::iterator it=sd_global->initial_tasks->begin();
+ it!=sd_global->initial_tasks->end(); ++it){
+ task = *it;
XBT_WARN("%s is in %s state", SD_task_get_name(task), state_names[SD_task_get_state(task)]);
}
}
#endif
xbt_mallocator_free(sd_global->task_mallocator);
- delete sd_global->initial_task_set;
- delete sd_global->executable_task_set;
- delete sd_global->completed_task_set;
+ delete sd_global->initial_tasks;
+ delete sd_global->executable_tasks;
+ delete sd_global->completed_tasks;
xbt_dynar_free_container(&(sd_global->return_set));
xbt_free(sd_global);
sd_global = nullptr;
/* Reset the content */
task->kind = SD_TASK_NOT_TYPED;
task->state= SD_NOT_SCHEDULED;
- sd_global->initial_task_set->push_back(task);
+ sd_global->initial_tasks->insert(task);
task->marked = 0;
*/
void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
{
- std::vector<SD_task_t>::iterator idx;
+ std::set<SD_task_t>::iterator idx;
switch (new_state) {
case SD_NOT_SCHEDULED:
case SD_SCHEDULABLE:
if (SD_task_get_state(task) == SD_FAILED){
- sd_global->initial_task_set->push_back(task);
- sd_global->completed_task_set->erase(std::remove(sd_global->completed_task_set->begin(),
- sd_global->completed_task_set->end(), task),
- sd_global->completed_task_set->end());
+ sd_global->completed_tasks->erase(task);
+ sd_global->initial_tasks->insert(task);
}
break;
case SD_SCHEDULED:
if (SD_task_get_state(task) == SD_RUNNABLE){
- sd_global->initial_task_set->push_back(task);
- sd_global->executable_task_set->erase(std::remove(sd_global->executable_task_set->begin(),
- sd_global->executable_task_set->end(), task),
- sd_global->executable_task_set->end());
+ sd_global->executable_tasks->erase(task);
+ sd_global->initial_tasks->insert(task);
}
break;
case SD_RUNNABLE:
- idx = std::find(sd_global->initial_task_set->begin(), sd_global->initial_task_set->end(), task);
- if (idx != sd_global->initial_task_set->end()) {
- sd_global->executable_task_set->push_back(*idx);
- sd_global->initial_task_set->erase(idx);
+ idx = std::find(sd_global->initial_tasks->begin(), sd_global->initial_tasks->end(), task);
+ if (idx != sd_global->initial_tasks->end()) {
+ sd_global->initial_tasks->erase(idx);
+ sd_global->executable_tasks->insert(*idx);
}
break;
case SD_RUNNING:
- sd_global->executable_task_set->erase(std::remove(sd_global->executable_task_set->begin(),
- sd_global->executable_task_set->end(), task),
- sd_global->executable_task_set->end());
+ sd_global->executable_tasks->erase(task);
break;
case SD_DONE:
- sd_global->completed_task_set->push_back(task);
+ sd_global->completed_tasks->insert(task);
task->finish_time = task->surf_action->getFinishTime();
task->remains = 0;
#if HAVE_JEDULE
#endif
break;
case SD_FAILED:
- sd_global->completed_task_set->push_back(task);
+ sd_global->completed_tasks->insert(task);
break;
default:
xbt_die( "Invalid state");
#ifndef SIMDAG_PRIVATE_H
#define SIMDAG_PRIVATE_H
-#include <vector>
+#include <set>
#include "xbt/dynar.h"
#include "simgrid/simdag.h"
#include "surf/surf.h"
bool watch_point_reached; /* has a task just reached a watch point? */
- std::vector<SD_task_t> *initial_task_set;
- std::vector<SD_task_t> *executable_task_set;
- std::vector<SD_task_t> *completed_task_set;
+ std::set<SD_task_t> *initial_tasks;
+ std::set<SD_task_t> *executable_tasks;
+ std::set<SD_task_t> *completed_tasks;
xbt_dynar_t return_set;
$ ${bindir:=.}/incomplete ../../../examples/platforms/two_hosts_platform_shared.xml "--log=root.fmt:[%10.6r]%e%m%n"
> [ 0.000000] Switching to the L07 model to handle parallel tasks.
> [ 8.000100] Simulation is finished but 3 tasks are still not done
-> [ 8.000100] Task B is in SD_SCHEDULABLE state
-> [ 8.000100] Task C is in SD_NOT_SCHEDULED state
> [ 8.000100] Task D is in SD_SCHEDULED state
+> [ 8.000100] Task C is in SD_NOT_SCHEDULED state
+> [ 8.000100] Task B is in SD_SCHEDULABLE state
> [ 8.000100] Simulation time: 8.000100