s_SD_task_t task;
- if (SD_INITIALISED()) {
- xbt_assert0(0, "SD_init() already called");
- }
+ xbt_assert0( !SD_INITIALISED() , "SD_init() already called");
sd_global = xbt_new(s_SD_global_t, 1);
sd_global->workstations = xbt_dict_new();
surf_init(argc, argv);
}
+/**
+ * \brief Reinits the application part of the simulation (experimental feature)
+ *
+ * This function allows you to run several simulations on the same platform
+ * by resetting the part describing the application.
+ *
+ * @warning: this function is still experimental and not perfect. For example,
+ * the simulation clock (and traces usage) is not reset. So, do not use it if
+ * you use traces in your simulation, and do not use absolute timing after using it.
+ * That being said, this function is still precious if you want to compare a bunch of
+ * heuristics on the same platforms.
+ */
+void SD_application_reinit(void) {
+
+ s_SD_task_t task;
+
+ if (SD_INITIALISED()) {
+ DEBUG0("Recreating the swags...");
+ xbt_swag_free(sd_global->not_scheduled_task_set);
+ xbt_swag_free(sd_global->scheduled_task_set);
+ xbt_swag_free(sd_global->ready_task_set);
+ xbt_swag_free(sd_global->in_fifo_task_set);
+ xbt_swag_free(sd_global->running_task_set);
+ xbt_swag_free(sd_global->done_task_set);
+ xbt_swag_free(sd_global->failed_task_set);
+
+ sd_global->not_scheduled_task_set = xbt_swag_new(xbt_swag_offset(task, state_hookup));
+ sd_global->scheduled_task_set = xbt_swag_new(xbt_swag_offset(task, state_hookup));
+ sd_global->ready_task_set = xbt_swag_new(xbt_swag_offset(task, state_hookup));
+ sd_global->in_fifo_task_set = xbt_swag_new(xbt_swag_offset(task, state_hookup));
+ sd_global->running_task_set = xbt_swag_new(xbt_swag_offset(task, state_hookup));
+ sd_global->done_task_set = 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->task_number = 0;
+ } else {
+ WARN0("SD_application_reinit called before initialization of SimDag");
+ /* we cannot use exceptions here because xbt is not running! */
+ }
+
+}
+
+
+
/**
* \brief Creates the environment
*
first_time = 0;
}
+ if(how_long>0) {
+ surf_timer_resource->extension_public->set(surf_get_clock()+how_long,
+ NULL,NULL);
+ }
sd_global->watch_point_reached = 0;
/* explore the ready tasks */
while (elapsed_time >= 0.0 &&
(how_long < 0.0 || total_time < how_long) &&
!sd_global->watch_point_reached) {
+ /* dumb variables */
+ void *fun = NULL;
+ void *arg = NULL;
+
DEBUG1("Total time: %f", total_time);
changed_tasks[changed_task_number] = NULL;
}
}
+
+ while (surf_timer_resource->extension_public->get(&fun,(void*)&arg)) {
+ }
}
/* we must reset every task->state_changed */
surf_exit();
}
else {
- fprintf(stderr, "Warning: SD_exit() called while SimDag was not running\n");
+ WARN0("SD_exit() called, but SimDag is not running");
/* we cannot use exceptions here because xbt is not running! */
}
}