- action->generic_action.remains -=
- lmm_variable_getvalue(action->variable)*delta;
-/* if(action->generic_action.remains<.00001) action->generic_action.remains=0; */
- if(action->generic_action.remains<=0) {
- action_change_state((surf_action_t)action, SURF_ACTION_DONE);
- } /* else if(host_failed..) */
+ surf_double_update(&(action->generic_action.remains),
+ lmm_variable_getvalue(action->variable) * delta);
+ if (action->generic_action.max_duration != NO_MAX_DURATION)
+ surf_double_update(&(action->generic_action.max_duration), delta);
+ if ((action->generic_action.remains <= 0) &&
+ (lmm_get_variable_weight(action->variable)>0)) {
+ action->generic_action.finish = surf_get_clock();
+ action_change_state((surf_action_t) action, SURF_ACTION_DONE);
+ } else if ((action->generic_action.max_duration != NO_MAX_DURATION) &&
+ (action->generic_action.max_duration <= 0)) {
+ action->generic_action.finish = surf_get_clock();
+ action_change_state((surf_action_t) action, SURF_ACTION_DONE);
+ } else { /* Need to check that none of the resource has failed */
+ lmm_constraint_t cnst = NULL;
+ int i = 0;
+ cpu_t cpu = NULL;
+
+ while ((cnst =
+ lmm_get_cnst_from_var(maxmin_system, action->variable,
+ i++))) {
+ cpu = lmm_constraint_id(cnst);
+ if (cpu->state_current == SURF_CPU_OFF) {
+ action->generic_action.finish = surf_get_clock();
+ action_change_state((surf_action_t) action, SURF_ACTION_FAILED);
+ break;
+ }
+ }
+ }