X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ea2730242c0c2b01ee200a9f1aecd2c4686eb7f2..c818afba85a6fa4a233d1cfd96711585c19e9fbe:/src/surf/cpu.c diff --git a/src/surf/cpu.c b/src/surf/cpu.c index ab19f4a11f..69aedef073 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -14,6 +14,7 @@ surf_cpu_model_t surf_cpu_model = NULL; lmm_system_t cpu_maxmin_system = NULL; xbt_dict_t cpu_set = NULL; +xbt_swag_t running_action_set_that_does_not_need_being_checked = NULL; static void cpu_free(void *cpu) { @@ -247,11 +248,12 @@ static void update_resource_state(void *id, cpu->state_current = SURF_CPU_OFF; - while(var = lmm_get_var_from_cnst(cpu_maxmin_system,cnst,&elem)) { + 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) { + surf_action_get_state(action)==SURF_ACTION_READY || + surf_action_get_state(action)==SURF_ACTION_NOT_IN_THE_SYSTEM) { action->finish = date; action_change_state( action, SURF_ACTION_FAILED); } @@ -291,6 +293,7 @@ static surf_action_t execute(void *cpu, double size) else action->generic_action.state_set = surf_cpu_model->common_public->states.failed_action_set; + xbt_swag_insert(action, action->generic_action.state_set); action->variable = lmm_variable_new(cpu_maxmin_system, action, @@ -304,12 +307,21 @@ static surf_action_t execute(void *cpu, double size) static surf_action_t action_sleep(void *cpu, double duration) { surf_action_cpu_Cas01_t action = 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 */ + xbt_swag_remove(action, ((surf_action_t)action)->state_set); + ((surf_action_t)action)->state_set =running_action_set_that_does_not_need_being_checked; + xbt_swag_insert(action, ((surf_action_t)action)->state_set); + } lmm_update_variable_weight(cpu_maxmin_system, action->variable, 0.0); XBT_OUT; @@ -421,6 +433,9 @@ static void surf_cpu_model_init_internal(void) surf_cpu_model->common_public->states.done_action_set = xbt_swag_new(xbt_swag_offset(action, state_hookup)); + running_action_set_that_does_not_need_being_checked = + xbt_swag_new(xbt_swag_offset(action, state_hookup)); + surf_cpu_model->common_public->name_service = name_service; surf_cpu_model->common_public->get_resource_name = get_resource_name; surf_cpu_model->common_public->action_get_state =