From 6a7c78afcfb651c6e585f19ec4f60089e8a483a8 Mon Sep 17 00:00:00 2001 From: alegrand Date: Wed, 21 May 2008 13:48:56 +0000 Subject: [PATCH] Speed up update_action_state AND generic_maxmin_share for sleep actions with no maximum duration. These sleep actions are not put in the running_action swag but in another private one. Thus, they're somehow hiden from the surf kernel but it does not need to see them anyway. The cpu module takes care of them as the only thing that might happen to them (from the surf kernel perspective) would be to fail, which is now done through the update_resource function. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@5484 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/surf/cpu.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/surf/cpu.c b/src/surf/cpu.c index facbf7ece6..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) { @@ -209,12 +210,6 @@ static void update_actions_state(double now, double delta) */ 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) @@ -257,7 +252,8 @@ static void update_resource_state(void *id, 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); } @@ -297,9 +293,8 @@ static surf_action_t execute(void *cpu, double size) else action->generic_action.state_set = surf_cpu_model->common_public->states.failed_action_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); + + xbt_swag_insert(action, action->generic_action.state_set); action->variable = lmm_variable_new(cpu_maxmin_system, action, action->generic_action.priority, @@ -312,7 +307,7 @@ 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; - xbt_swag_t action_set = NULL; + if (duration>0) duration=MAX(duration,MAXMIN_PRECISION); @@ -323,9 +318,9 @@ static surf_action_t action_sleep(void *cpu, double duration) 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); + 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); @@ -438,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 = -- 2.20.1