-void surf_action_change_state(surf_action_t action,
- e_surf_action_state_t state)
-{
- surf_action_state_t action_state =
- &(action->model_type->common_public->states);
- XBT_IN2("(%p,%s)", action, surf_action_state_names[state]);
- xbt_swag_remove(action, action->state_set);
-
- if (state == SURF_ACTION_READY)
- action->state_set = action_state->ready_action_set;
- else if (state == SURF_ACTION_RUNNING)
- action->state_set = action_state->running_action_set;
- else if (state == SURF_ACTION_FAILED)
- action->state_set = action_state->failed_action_set;
- else if (state == SURF_ACTION_DONE)
- action->state_set = action_state->done_action_set;
+ while((action = xbt_swag_extract(model->model_private->modified_set))) {
+ int max_dur_flag = 0;
+
+ if (action->generic_action.state_set !=
+ model->states.running_action_set)
+ continue;
+
+ /* bogus priority, skip it */
+ if (action->generic_action.priority <= 0)
+ continue;
+
+ generic_update_action_remaining_lazy(action,now);
+
+ min = -1;
+ value = lmm_variable_getvalue(action->variable);
+ if (value > 0) {
+ if (action->generic_action.remains > 0) {
+ value = action->generic_action.remains / value;
+ min = now + value;
+ } else {
+ value = 0.0;
+ min = now;
+ }
+ }
+
+ if ((action->generic_action.max_duration != NO_MAX_DURATION)
+ && (min == -1
+ || action->generic_action.start +
+ action->generic_action.max_duration < min)) {
+ min = action->generic_action.start +
+ action->generic_action.max_duration;
+ max_dur_flag = 1;
+ }
+
+ XBT_DEBUG("Action(%p) Start %lf Finish %lf Max_duration %lf", action,
+ action->generic_action.start, now + value,
+ action->generic_action.max_duration);
+
+ if (min != -1) {
+ surf_action_lmm_heap_remove(model->model_private->action_heap,action);
+ surf_action_lmm_heap_insert(model->model_private->action_heap,action, min, max_dur_flag ? MAX_DURATION : NORMAL);
+ XBT_DEBUG("Insert at heap action(%p) min %lf now %lf", action, min,
+ now);
+ } else DIE_IMPOSSIBLE;
+ }
+
+ //hereafter must have already the min value for this resource model
+ if (xbt_heap_size(model->model_private->action_heap) > 0)
+ min = xbt_heap_maxkey(model->model_private->action_heap) - now;