*/
xbt_swag_foreach_safe(action, next_action, running_actions) {
+ if (action->generic_action.max_duration == NO_MAX_DURATION &&
+ action->suspended==2 )
+ /* Rely on the fact that sleep action with no duration are on
+ the end of the queue */
+ break;
+
double_update(&(action->generic_action.remains),
lmm_variable_getvalue(action->variable) * delta);
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 model has failed */
- lmm_constraint_t cnst = NULL;
- int i = 0;
- cpu_Cas01_t cpu = NULL;
-
- while ((cnst =
- lmm_get_cnst_from_var(cpu_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;
- }
- }
}
}
static void update_resource_state(void *id,
tmgr_trace_event_t event_type,
- double value)
+ double value, double date)
{
cpu_Cas01_t cpu = id;
} else if (event_type == cpu->state_event) {
if (value > 0)
cpu->state_current = SURF_CPU_ON;
- else
+ else {
+ lmm_constraint_t cnst = cpu->constraint;
+ lmm_variable_t var = NULL;
+ lmm_element_t elem = NULL;
+
cpu->state_current = SURF_CPU_OFF;
+
+ while((var = lmm_get_var_from_cnst(cpu_maxmin_system,cnst,&elem))) {
+ surf_action_t action = lmm_variable_id(var) ;
+
+ if(surf_action_get_state(action)==SURF_ACTION_RUNNING ||
+ surf_action_get_state(action)==SURF_ACTION_READY) {
+ action->finish = date;
+ action_change_state( action, SURF_ACTION_FAILED);
+ }
+ }
+ }
} else {
CRITICAL0("Unknown event ! \n");
xbt_abort();
else
action->generic_action.state_set =
surf_cpu_model->common_public->states.failed_action_set;
- xbt_swag_insert(action, action->generic_action.state_set);
+ /* Insert at the head by default. This convention is used to speed
+ up update_resource_state */
+ xbt_swag_insert_at_head(action, action->generic_action.state_set);
action->variable = lmm_variable_new(cpu_maxmin_system, action,
action->generic_action.priority,
static surf_action_t action_sleep(void *cpu, double duration)
{
surf_action_cpu_Cas01_t action = NULL;
- duration=MAX(duration,MAXMIN_PRECISION);
+ xbt_swag_t action_set = NULL;
+ if (duration>0)
+ duration=MAX(duration,MAXMIN_PRECISION);
+
XBT_IN2("(%s,%g)", ((cpu_Cas01_t) cpu)->name, duration);
action = (surf_action_cpu_Cas01_t) execute(cpu, 1.0);
action->generic_action.max_duration = duration;
action->suspended = 2;
+ if(duration == NO_MAX_DURATION) {
+ /* Move to the *end* of the corresponding action set. This convention
+ is used to speed up update_resource_state */
+ action_set = action->generic_action.state_set;
+ xbt_swag_remove(action, action_set);
+ xbt_swag_insert(action, action_set);
+ }
lmm_update_variable_weight(cpu_maxmin_system, action->variable, 0.0);
XBT_OUT;