+ xbt_assert1(__SD_task_is_running(task), "The task must be running! Task state: %d", SD_task_get_state(task));
+ xbt_assert1(task->workstation_list != NULL, "Task '%s': workstation_list is NULL!", SD_task_get_name(task));
+
+
+ candidates = xbt_new(SD_task_t, 8);
+
+ __SD_task_set_state(task, SD_DONE);
+ surf_workstation_resource->common_public->action_free(task->surf_action);
+ task->surf_action = NULL;
+
+ DEBUG0("Looking for candidates");
+
+ /* if the task was executed on sequential workstations,
+ maybe we can execute the next task of the fifo for each workstation */
+ for (i = 0; i < task->workstation_nb; i++) {
+ workstation = task->workstation_list[i];
+ DEBUG2("Workstation '%s': access_mode = %d", SD_workstation_get_name(workstation), workstation->access_mode);
+ if (workstation->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS) {
+ xbt_assert1(workstation->task_fifo != NULL, "Workstation '%s' has sequential access but no fifo!",
+ SD_workstation_get_name(workstation));
+ xbt_assert2(workstation->current_task = task, "Workstation '%s': current task should be '%s'",
+ SD_workstation_get_name(workstation), SD_task_get_name(task));
+
+ /* the task is over so we can release the workstation */
+ workstation->current_task = NULL;
+
+ DEBUG0("Getting candidate in fifo");
+ candidate = xbt_fifo_get_item_content(xbt_fifo_get_first_item(workstation->task_fifo));
+
+ if (candidate != NULL) {
+ DEBUG1("Candidate: '%s'", SD_task_get_name(candidate));
+ xbt_assert2(__SD_task_is_in_fifo(candidate), "Bad state of candidate '%s': %d",
+ SD_task_get_name(candidate), SD_task_get_state(candidate));
+ }
+
+ DEBUG1("Candidate in fifo: %p", candidate);
+
+ /* if there was a task waiting for my place */
+ if (candidate != NULL) {
+ /* Unfortunately, we are not sure yet that we can execute the task now,
+ because the task can be waiting more deeply in some other workstation's fifos...
+ So we memorize all candidate tasks, and then we will check for each candidate
+ whether or not all its workstations are available. */
+
+ /* realloc if necessary */
+ if (candidate_nb == candidate_capacity) {
+ candidate_capacity *= 2;
+ candidates = xbt_realloc(candidates, sizeof(SD_task_t) * candidate_capacity);
+ }
+
+ /* register the candidate */
+ candidates[candidate_nb++] = candidate;
+ candidate->fifo_checked = 0;
+ }
+ }
+ }
+
+ DEBUG1("Candidates found: %d", candidate_nb);