* \see SD_create_environment(), SD_exit()
*/
void SD_init(int *argc, char **argv) {
- xbt_assert0(sd_global == NULL, "SD_init already called");
+ if (SD_INITIALISED()) {
+ xbt_assert0(0, "SD_init() already called");
+ }
sd_global = xbt_new0(s_SD_global_t, 1);
sd_global->workstations = xbt_dict_new();
SD_CHECK_INIT_DONE();
+ DEBUG0("SD_create_environment");
+
surf_timer_resource_init(platform_file); /* tell Surf to create the environnement */
- /*surf_workstation_resource_init_KCCFLN05(platform_file);*/
- surf_workstation_resource_init_CLM03(platform_file);
+ surf_workstation_resource_init_KCCFLN05(platform_file);
+/* surf_workstation_resource_init_CLM03(platform_file); */
/* now let's create the SD wrappers for workstations and links */
xbt_dict_foreach(workstation_set, cursor, name, surf_workstation) {
int i;
static int first_time = 1;
+ SD_CHECK_INIT_DONE();
+
INFO0("Starting simulation...");
/* create the array that will be returned */
/* explore the ready tasks */
xbt_swag_foreach(task, sd_global->ready_task_set) {
INFO1("Executing task '%s'", SD_task_get_name(task));
- task->surf_action = __SD_task_run(task);
+ __SD_task_run(task);
surf_workstation_resource->common_public->action_set_data(task->surf_action, task);
task->state_changed = 1;
task = action->data;
INFO1("Task '%s' done", SD_task_get_name(task));
__SD_task_set_state(task, SD_DONE);
- xbt_free(action);
+ surf_workstation_resource->common_public->action_free(action);
task->surf_action = NULL;
/* the state has changed */
task = action->data;
INFO1("Task '%s' failed", SD_task_get_name(task));
__SD_task_set_state(task, SD_FAILED);
- xbt_free(action);
+ surf_workstation_resource->common_public->action_free(action);
task->surf_action = NULL;
if (!task->state_changed) {
}
/**
- * \brief Destroys all SD internal data.
+ * \brief Returns the current clock
+ *
+ * \return the current clock, in second
+ */
+double SD_get_clock(void) {
+ SD_CHECK_INIT_DONE();
+
+ return surf_get_clock();
+}
+
+/**
+ * \brief Destroys all SD internal data
*
* This function should be called when the simulation is over. Don't forget also to destroy
* the tasks.
* \see SD_init(), SD_task_destroy()
*/
void SD_exit(void) {
- if (sd_global != NULL) {
+ if (SD_INITIALISED()) {
DEBUG0("Destroying workstation and link dictionaries...");
xbt_dict_free(&sd_global->workstations);
xbt_dict_free(&sd_global->links);
xbt_swag_free(sd_global->failed_task_set);
xbt_free(sd_global);
+ sd_global = NULL;
DEBUG0("Exiting Surf...");
surf_exit();
}
+ else {
+ fprintf(stderr, "Warning: SD_exit() called while SimDag was not running\n");
+ /* we cannot use exceptions here because xbt is not running! */
+ }
}