- /* temporary test to access to the surf workstation structure */
- xbt_dict_cursor_t cursor = NULL;
- char *name = NULL;
- void *workstation = NULL;
- const char *surf_name;
- int speed;
-
- xbt_dict_foreach(workstation_set, cursor, name, workstation) {
- surf_name = surf_workstation_resource->common_public->get_resource_name(workstation);
- speed = surf_workstation_resource->extension_public->get_speed(workstation, 1.0);
- printf("Workstation name: %s, Surf name: %s, speed: %d\n", name, surf_name, speed);
+ /* create the array that will be returned */
+ changed_tasks = xbt_new0(SD_task_t, changed_task_capacity);
+ changed_tasks[0] = NULL;
+
+ surf_solve(); /* Takes traces into account. Returns 0.0 */
+
+ sd_global->watch_point_reached = 0;
+
+ /* main loop */
+ while (elapsed_time >= 0.0 && total_time < how_long && !sd_global->watch_point_reached) {
+
+ /* explore the ready tasks */
+ xbt_swag_foreach(task, sd_global->ready_task_set) {
+ INFO1("Executing task '%s'", SD_task_get_name(task));
+ task->state_changed = 0;
+ action = __SD_task_run(task);
+ surf_workstation_resource->common_public->action_set_data(action, task);
+ task->state_changed = 1;
+
+ changed_tasks[changed_task_number++] = task; /* replace NULL by the task */
+ if (changed_task_number == changed_task_capacity) {
+ changed_task_capacity *= 2;
+ changed_tasks = xbt_realloc(changed_tasks, sizeof(SD_task_t) * changed_task_capacity);
+ }
+ changed_tasks[changed_task_number] = NULL;
+ }
+
+ elapsed_time = surf_solve();
+ if (elapsed_time > 0.0)
+ total_time += elapsed_time;
+
+ /* let's see which tasks are done */
+ while ((action = xbt_swag_extract(surf_workstation_resource->common_public->states.done_action_set))) {
+ task = action->data;
+ INFO1("Task '%s' done", SD_task_get_name(task));
+ __SD_task_set_state(task, SD_DONE);
+ __SD_task_remove_dependencies(task);
+ if (!task->state_changed) {
+ task->state_changed = 1;
+ changed_tasks[changed_task_number++] = task;
+ }
+ }
+
+ /* let's see which tasks have just failed */
+ while ((action = xbt_swag_extract(surf_workstation_resource->common_public->states.failed_action_set))) {
+ task = action->data;
+ INFO1("Task '%s' failed", SD_task_get_name(task));
+ __SD_task_set_state(task, SD_FAILED);
+ if (!task->state_changed) {
+ task->state_changed = 1;
+ changed_tasks[changed_task_number++] = task;
+ }
+ }