#include "simdag/simdag.h"
#include "simdag/datatypes.h"
#include "surf/surf.h"
+#include "xbt/swag.h"
#include <stdbool.h>
#define SD_INITIALISED() (sd_global != NULL)
xbt_swag_t done_task_set;
xbt_swag_t failed_task_set;
+ xbt_swag_t return_set;
int task_number;
} s_SD_global_t, *SD_global_t;
/* Task */
typedef struct SD_task {
s_xbt_swag_hookup_t state_hookup;
+ s_xbt_swag_hookup_t return_hookup;
xbt_swag_t state_set;
e_SD_task_state_t state;
void *data; /* user data */
} s_SD_dependency_t, *SD_dependency_t;
/* SimDag private functions */
+XBT_PUBLIC(xbt_swag_t) SD_simulate_swag(double how_long); /* could be public, but you need to see the internals of the SD_task_t to use it */
+
SD_link_t __SD_link_create(void *surf_link, void *data);
void __SD_link_destroy(void *link);
xbt_swag_new(xbt_swag_offset(task, state_hookup));
sd_global->failed_task_set =
xbt_swag_new(xbt_swag_offset(task, state_hookup));
+ sd_global->return_set =
+ xbt_swag_new(xbt_swag_offset(task, return_hookup));
sd_global->task_number = 0;
surf_init(argc, argv);
* \return a NULL-terminated array of \ref SD_task_t whose state has changed.
* \see SD_task_schedule(), SD_task_watch()
*/
-xbt_dynar_t SD_simulate(double how_long)
-{
+
+xbt_dynar_t SD_simulate(double how_long) {
+ xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL);
+ SD_task_t task;
+
+ SD_simulate_swag(how_long);
+ while( (task = xbt_swag_extract(sd_global->return_set)) != NULL) {
+ xbt_dynar_push(changed_tasks, &task);
+ }
+
+ return changed_tasks;
+}
+
+xbt_swag_t SD_simulate_swag(double how_long) {
double total_time = 0.0; /* we stop the simulation when total_time >= how_long */
double elapsed_time = 0.0;
SD_task_t task, task_safe, dst;
SD_dependency_t dependency;
surf_action_t action;
- xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL);
unsigned int iter, depcnt;
static int first_time = 1;
SD_CHECK_INIT_DONE();
if (first_time) {
- XBT_VERB("Starting simulation...");
+ XBT_VERB("Starting simulation...");
- surf_presolve(); /* Takes traces into account */
- first_time = 0;
- }
+ surf_presolve(); /* Takes traces into account */
+ first_time = 0;
+ }
sd_global->watch_point_reached = 0;
+ while(xbt_swag_extract(sd_global->return_set)) {}
+
/* explore the runnable tasks */
- xbt_swag_foreach_safe(task, task_safe, sd_global->runnable_task_set) {
+ xbt_swag_foreach(task, sd_global->runnable_task_set) {
XBT_VERB("Executing task '%s'", SD_task_get_name(task));
- if (__SD_task_try_to_run(task)
- && !xbt_dynar_member(changed_tasks, &task))
- xbt_dynar_push(changed_tasks, &task);
+ if (__SD_task_try_to_run(task))
+ xbt_swag_insert(task,sd_global->return_set);
}
/* main loop */
SD_task_get_name(task));
/* the state has changed */
- if (!xbt_dynar_member(changed_tasks, &task))
- xbt_dynar_push(changed_tasks, &task);
+ xbt_swag_insert(task,sd_global->return_set);
/* remove the dependencies after this task */
xbt_dynar_foreach(task->tasks_after, depcnt, dependency) {
if (__SD_task_is_runnable(dst)
&& !sd_global->watch_point_reached) {
XBT_VERB("Executing task '%s'", SD_task_get_name(dst));
- if (__SD_task_try_to_run(dst) &&
- !xbt_dynar_member(changed_tasks, &task))
- xbt_dynar_push(changed_tasks, &task);
+ if (__SD_task_try_to_run(dst))
+ xbt_swag_insert(dst,sd_global->return_set);
}
}
}
surf_workstation_model->action_unref(action);
task->surf_action = NULL;
- if (!xbt_dynar_member(changed_tasks, &task))
- xbt_dynar_push(changed_tasks, &task);
+ xbt_swag_insert(task,sd_global->return_set);
}
}
}
elapsed_time, total_time, sd_global->watch_point_reached);
XBT_DEBUG("current time = %f", surf_get_clock());
- return changed_tasks;
+ return sd_global->return_set;
}
/**
task->state_hookup.next = NULL;
task->state_set = sd_global->not_scheduled_task_set;
task->state = SD_NOT_SCHEDULED;
+ task->return_hookup.prev = NULL;
+ task->return_hookup.next = NULL;
+
task->marked = 0;
xbt_swag_insert(task, task->state_set);
if (__SD_task_is_scheduled_or_runnable(task))
__SD_task_destroy_scheduling_data(task);
xbt_swag_remove(task, task->state_set);
+ xbt_swag_remove(task, sd_global->return_set);
if (task->name != NULL)
xbt_free(task->name);
switch (task->kind) {
case SD_TASK_COMM_E2E:
case SD_TASK_COMP_SEQ:
- xbt_assert(task->workstation_nb == count);
+ xbt_assert(task->workstation_nb == count,"Got %d locations, but were expecting %d locations",count,task->workstation_nb);
for (i = 0; i < count; i++)
task->workstation_list[i] = list[i];
SD_task_do_schedule(task);