X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3eef4e948ebd9b1d8c9d26a6dedd535109856554..b3973f5189df8d8983e47336546fd0259f0e2dab:/examples/simdag/scheduling/minmin_test.c diff --git a/examples/simdag/scheduling/minmin_test.c b/examples/simdag/scheduling/minmin_test.c index 089066555b..87907184d4 100644 --- a/examples/simdag/scheduling/minmin_test.c +++ b/examples/simdag/scheduling/minmin_test.c @@ -1,6 +1,6 @@ /* simple test to schedule a DAX file with the Min-Min algorithm. */ -/* Copyright (c) 2009, 2010. The SimGrid Team. +/* Copyright (c) 2009-2014. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -20,6 +20,7 @@ typedef struct _WorkstationAttribute *WorkstationAttribute; struct _WorkstationAttribute { /* Earliest time at wich a workstation is ready to execute a task */ double available_at; + SD_task_t last_scheduled_task; }; static void SD_workstation_allocate_attribute(SD_workstation_t workstation) @@ -51,6 +52,19 @@ static void SD_workstation_set_available_at(SD_workstation_t workstation, SD_workstation_set_data(workstation, attr); } +static SD_task_t SD_workstation_get_last_scheduled_task( SD_workstation_t workstation){ + WorkstationAttribute attr = + (WorkstationAttribute) SD_workstation_get_data(workstation); + return attr->last_scheduled_task; +} + +static void SD_workstation_set_last_scheduled_task(SD_workstation_t workstation, + SD_task_t task){ + WorkstationAttribute attr = + (WorkstationAttribute) SD_workstation_get_data(workstation); + attr->last_scheduled_task=task; + SD_workstation_set_data(workstation, attr); +} static xbt_dynar_t get_ready_tasks(xbt_dynar_t dax) { @@ -84,7 +98,7 @@ static double finish_on_at(SD_task_t task, SD_workstation_t workstation) parents = SD_task_get_parents(task); - if (xbt_dynar_length(parents)) { + if (!xbt_dynar_is_empty(parents)) { /* compute last_data_available */ last_data_available = -1.0; xbt_dynar_foreach(parents, i, parent) { @@ -235,7 +249,7 @@ int main(int argc, char **argv) { unsigned int cursor; double finish_time, min_finish_time = -1.0; - SD_task_t task, selected_task = NULL; + SD_task_t task, selected_task = NULL, last_scheduled_task; xbt_dynar_t ready_tasks; SD_workstation_t workstation, selected_workstation = NULL; int total_nworkstations = 0; @@ -292,7 +306,7 @@ int main(int argc, char **argv) while (!xbt_dynar_is_empty((changed = SD_simulate(-1.0)))) { /* Get the set of ready tasks */ ready_tasks = get_ready_tasks(dax); - if (!xbt_dynar_length(ready_tasks)) { + if (xbt_dynar_is_empty(ready_tasks)) { xbt_dynar_free_container(&ready_tasks); xbt_dynar_free_container(&changed); /* there is no ready task, let advance the simulation */ @@ -318,6 +332,31 @@ int main(int argc, char **argv) SD_workstation_get_name(selected_workstation)); SD_task_schedulel(selected_task, 1, selected_workstation); + + /* + * SimDag allows tasks to be executed concurrently when they can by default. + * Yet schedulers take decisions assuming that tasks wait for resource + * availability to start. + * The solution (well crude hack is to keep track of the last task scheduled + * on a workstation and add a special type of dependency if needed to + * force the sequential execution meant by the scheduler. + * If the last scheduled task is already done, has failed or is a + * predecessor of the current task, no need for a new dependency + */ + + last_scheduled_task = + SD_workstation_get_last_scheduled_task(selected_workstation); + if (last_scheduled_task && + (SD_task_get_state(last_scheduled_task) != SD_DONE) && + (SD_task_get_state(last_scheduled_task) != SD_FAILED) && + !SD_task_dependency_exists( + SD_workstation_get_last_scheduled_task(selected_workstation), + selected_task)) + SD_task_dependency_add("resource", NULL, + last_scheduled_task, selected_task); + + SD_workstation_set_last_scheduled_task(selected_workstation, selected_task); + SD_workstation_set_available_at(selected_workstation, min_finish_time); xbt_dynar_free_container(&ready_tasks);