From: alegrand Date: Fri, 4 Feb 2005 05:39:50 +0000 (+0000) Subject: Major bug fix in SURF. X-Git-Tag: v3.3~4504 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/899a3b2de973f018bd96d419212ee4cdb2860b85?ds=sidebyside Major bug fix in SURF. In MSG, tasks that were transfered multiple times or whose state was changed did leave some variables in the linear system. Those variables were removed only when the corresponding tasks was destroyed. So sometimes, the result was correct (as in the comparison with masterslave3 of the old MSG). git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@847 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/surf/cpu.c b/src/surf/cpu.c index 490ac652cb..31307f6a9e 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -106,10 +106,9 @@ static int resource_used(void *resource_id) static void action_free(surf_action_t action) { - surf_action_cpu_t Action = (surf_action_cpu_t) action; - xbt_swag_remove(action, action->state_set); - lmm_variable_free(maxmin_system, Action->variable); + if(((surf_action_cpu_t)action)->variable) + lmm_variable_free(maxmin_system, ((surf_action_cpu_t)action)->variable); xbt_free(action); return; @@ -128,6 +127,12 @@ static void action_recycle(surf_action_t action) static void action_change_state(surf_action_t action, e_surf_action_state_t state) { + if((state==SURF_ACTION_DONE) || (state==SURF_ACTION_FAILED)) + if(((surf_action_cpu_t)action)->variable) { + lmm_variable_free(maxmin_system, ((surf_action_cpu_t)action)->variable); + ((surf_action_cpu_t)action)->variable = NULL; + } + surf_action_change_state(action, state); return; } diff --git a/src/surf/network.c b/src/surf/network.c index 9a59eaf1b1..0590f9a934 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -210,10 +210,9 @@ static int resource_used(void *resource_id) static void action_free(surf_action_t action) { - surf_action_network_t Action = (surf_action_network_t) action; - xbt_swag_remove(action, action->state_set); - lmm_variable_free(maxmin_system, Action->variable); + if(((surf_action_network_t)action)->variable) + lmm_variable_free(maxmin_system, ((surf_action_network_t)action)->variable); xbt_free(action); return; @@ -232,6 +231,12 @@ static void action_recycle(surf_action_t action) static void action_change_state(surf_action_t action, e_surf_action_state_t state) { + if((state==SURF_ACTION_DONE) || (state==SURF_ACTION_FAILED)) + if(((surf_action_network_t)action)->variable) { + lmm_variable_free(maxmin_system, ((surf_action_network_t)action)->variable); + ((surf_action_network_t)action)->variable = NULL; + } + surf_action_change_state(action, state); return; } @@ -404,7 +409,7 @@ static surf_action_t communicate(void *src, void *dst, double size, double rate) min(action->rate,SG_TCP_CTE_GAMMA / action->lat_current)); if(route_size == 0) { - surf_action_change_state((surf_action_t) action, SURF_ACTION_DONE); + action_change_state((surf_action_t) action, SURF_ACTION_DONE); } for (i = 0; i < route_size; i++) diff --git a/src/surf/workstation.c b/src/surf/workstation.c index 0bfebdbe3b..b0c219ce55 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -75,6 +75,11 @@ static int resource_used(void *resource_id) static void action_free(surf_action_t action) { + if(action->resource_type==(surf_resource_t)surf_network_resource) + surf_network_resource->common_public->action_free(action); + else if(action->resource_type==(surf_resource_t)surf_cpu_resource) + surf_cpu_resource->common_public->action_free(action); + else DIE_IMPOSSIBLE; return; } @@ -91,7 +96,11 @@ static void action_recycle(surf_action_t action) static void action_change_state(surf_action_t action, e_surf_action_state_t state) { - surf_action_change_state(action, state); + if(action->resource_type==(surf_resource_t)surf_network_resource) + surf_network_resource->common_public->action_change_state(action,state); + else if(action->resource_type==(surf_resource_t)surf_cpu_resource) + surf_cpu_resource->common_public->action_change_state(action,state); + else DIE_IMPOSSIBLE; return; } diff --git a/src/surf/workstation_KCCFLN05.c b/src/surf/workstation_KCCFLN05.c index 51fda8fa97..8c1342603e 100644 --- a/src/surf/workstation_KCCFLN05.c +++ b/src/surf/workstation_KCCFLN05.c @@ -394,6 +394,11 @@ static double share_network_KCCFLN05_resources(double now) static void action_network_KCCFLN05_change_state(surf_action_t action, e_surf_action_state_t state) { + if((state==SURF_ACTION_DONE) || (state==SURF_ACTION_FAILED)) + if(((surf_action_network_KCCFLN05_t)action)->variable) { + lmm_variable_free(maxmin_system, ((surf_action_network_KCCFLN05_t)action)->variable); + ((surf_action_network_KCCFLN05_t)action)->variable = NULL; + } surf_action_change_state(action, state); return; } @@ -505,6 +510,19 @@ static void action_cpu_KCCFLN05_free(surf_action_t action) xbt_free(action); } +static void action_cpu_KCCFLN05_change_state(surf_action_t action, + e_surf_action_state_t state) +{ + if((state==SURF_ACTION_DONE) || (state==SURF_ACTION_FAILED)) + if(((surf_action_cpu_KCCFLN05_t)action)->variable) { + lmm_variable_free(maxmin_system, ((surf_action_cpu_KCCFLN05_t)action)->variable); + ((surf_action_cpu_KCCFLN05_t)action)->variable = NULL; + } + + surf_action_change_state(action, state); + return; +} + /* #define WARNING(format, ...) (fprintf(stderr, "[%s , %s : %d] ", __FILE__, __FUNCTION__, __LINE__),\ */ /* fprintf(stderr, format, ## __VA_ARGS__), \ */ /* fprintf(stderr, "\n")) */ @@ -594,11 +612,11 @@ static void update_actions_cpu_KCCFLN05_state(double now, double delta) if ((action->generic_action.remains <= 0) && (lmm_get_variable_weight(action->variable)>0)) { action->generic_action.finish = surf_get_clock(); - surf_action_change_state((surf_action_t) action, SURF_ACTION_DONE); + action_cpu_KCCFLN05_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(); - surf_action_change_state((surf_action_t) action, SURF_ACTION_DONE); + action_cpu_KCCFLN05_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; @@ -610,7 +628,7 @@ static void update_actions_cpu_KCCFLN05_state(double now, double delta) cpu = lmm_constraint_id(cnst); if (cpu->state_current == SURF_CPU_OFF) { action->generic_action.finish = surf_get_clock(); - surf_action_change_state((surf_action_t) action, SURF_ACTION_FAILED); + action_cpu_KCCFLN05_change_state((surf_action_t) action, SURF_ACTION_FAILED); break; } } @@ -675,8 +693,11 @@ static int cpu_KCCFLN05_action_is_suspended(surf_action_t action) static void action_change_state(surf_action_t action, e_surf_action_state_t state) { - xbt_assert0(0, "Workstation is a virtual resource. I should not be there!"); - surf_action_change_state(action, state); + if(action->resource_type==(surf_resource_t)surf_network_resource) + surf_network_resource->common_public->action_change_state(action,state); + else if(action->resource_type==(surf_resource_t)surf_cpu_resource) + surf_cpu_resource->common_public->action_change_state(action,state); + else DIE_IMPOSSIBLE; return; } @@ -796,7 +817,7 @@ static void cpu_KCCFLN05_resource_init_internal(void) surf_cpu_resource->common_public->action_free = action_cpu_KCCFLN05_free; surf_cpu_resource->common_public->action_cancel = NULL; surf_cpu_resource->common_public->action_recycle = NULL; - surf_cpu_resource->common_public->action_change_state = surf_action_change_state; + surf_cpu_resource->common_public->action_change_state = action_cpu_KCCFLN05_change_state; surf_cpu_resource->common_public->action_set_data = surf_action_set_data; surf_cpu_resource->common_public->name = "CPU KCCFLN05";