From: alegrand Date: Fri, 31 Dec 2004 02:49:39 +0000 (+0000) Subject: Mem leak hunting! X-Git-Tag: v3.3~4646 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/06bb605c18bd9a9b704b0415d41ab31e02b49839 Mem leak hunting! git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@704 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/surf/cpu.c b/src/surf/cpu.c index ca1056e466..a3c4d94c64 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -14,13 +14,10 @@ surf_cpu_resource_t surf_cpu_resource = NULL; xbt_dict_t cpu_set = NULL; -static void cpu_free(void *CPU) +static void cpu_free(void *cpu) { -/* cpu_t cpu = CPU; */ -/* lmm_constraint_free(maxmin_system,cpu->constraint); */ -/* Clean somewhere else ! */ - - xbt_free(CPU); + xbt_free(((cpu_t)cpu)->name); + xbt_free(cpu); } /* power_scale is the basic power of the cpu when the cpu is @@ -29,7 +26,7 @@ static void cpu_free(void *CPU) state_trace values mean SURF_CPU_ON if >0 and SURF_CPU_OFF otherwise. */ -static cpu_t cpu_new(const char *name, double power_scale, +static cpu_t cpu_new(char *name, double power_scale, double power_initial, tmgr_trace_t power_trace, e_surf_cpu_state_t state_initial, diff --git a/src/surf/cpu_private.h b/src/surf/cpu_private.h index 17715ee9b7..a14ccb55b9 100644 --- a/src/surf/cpu_private.h +++ b/src/surf/cpu_private.h @@ -19,7 +19,7 @@ typedef struct surf_action_cpu { typedef struct cpu { surf_resource_t resource; /* Any such object, added in a trace should start by this field!!! */ - const char *name; + char *name; double power_scale; double power_current; tmgr_trace_event_t power_event; diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index a346b1f6a1..31d816a539 100644 --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -125,7 +125,8 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id, var->weight = weight; var->bound = bound; var->value = 0.0; - insert_variable(sys, var); + if(weight) xbt_swag_insert_at_head(var,&(sys->variable_set)); + else xbt_swag_insert_at_tail(var,&(sys->variable_set)); return var; } @@ -157,7 +158,8 @@ void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, elem->constraint = cnst; elem->variable = var; - insert_elem_in_constraint(elem); + if(var->weight) xbt_swag_insert_at_head(elem,&(elem->constraint->element_set)); + else xbt_swag_insert_at_tail(elem,&(elem->constraint->element_set)); make_constraint_active(sys, cnst); } @@ -230,9 +232,11 @@ static void saturated_variable_set_update(lmm_system_t sys) cnst_list = &(sys->saturated_constraint_set); while ((cnst = xbt_swag_getFirst(cnst_list))) { elem_list = &(cnst->active_element_set); - xbt_swag_foreach(elem, elem_list) - if ((elem->value > 0) && (elem->variable->weight > 0)) - xbt_swag_insert(elem->variable, &(sys->saturated_variable_set)); + xbt_swag_foreach(elem, elem_list) { + if(elem->variable->weight<=0) break; + if ((elem->value > 0)) + xbt_swag_insert(elem->variable, &(sys->saturated_variable_set)); + } xbt_swag_remove(cnst, cnst_list); } @@ -267,7 +271,8 @@ void lmm_solve(lmm_system_t sys) cnst->remaining = cnst->bound; cnst->usage = 0; xbt_swag_foreach(elem, elem_list) { - if ((elem->value > 0) && (elem->variable->weight > 0)) { + if(elem->variable->weight <=0) break; + if ((elem->value > 0)) { cnst->usage += elem->value / elem->variable->weight; insert_active_elem_in_constraint(elem); } @@ -352,6 +357,9 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var, { sys->modified = 1; var->weight = weight; + xbt_swag_remove(var,&(sys->variable_set)); + if(weight) xbt_swag_insert_at_head(var,&(sys->variable_set)); + else xbt_swag_insert_at_tail(var,&(sys->variable_set)); } diff --git a/src/surf/maxmin_private.h b/src/surf/maxmin_private.h index 7053c9ad14..2b0ae5f2a1 100644 --- a/src/surf/maxmin_private.h +++ b/src/surf/maxmin_private.h @@ -20,8 +20,7 @@ typedef struct lmm_element { lmm_variable_t variable; double value; } s_lmm_element_t, *lmm_element_t; -#define insert_elem_in_constraint(elem) xbt_swag_insert(elem,&(elem->constraint->element_set)) -#define insert_active_elem_in_constraint(elem) xbt_swag_insert(elem,&(elem->constraint->active_element_set)) +#define insert_active_elem_in_constraint(elem) xbt_swag_insert_at_head(elem,&(elem->constraint->active_element_set)) #define remove_active_elem_in_constraint(elem) xbt_swag_remove(elem,&(elem->constraint->active_element_set)) typedef struct lmm_constraint { @@ -65,7 +64,6 @@ typedef struct lmm_system { #define extract_variable(sys) xbt_swag_remove(xbt_swag_getFirst(&(sys->variable_set)),&(sys->variable_set)) #define extract_constraint(sys) xbt_swag_remove(xbt_swag_getFirst(&(sys->constraint_set)),&(sys->constraint_set)) -#define insert_variable(sys,var) xbt_swag_insert(var,&(sys->variable_set)) #define insert_constraint(sys,cnst) xbt_swag_insert(cnst,&(sys->constraint_set)) #define remove_variable(sys,var) do {xbt_swag_remove(var,&(sys->variable_set));\ xbt_swag_remove(var,&(sys->saturated_variable_set));} while(0) diff --git a/src/surf/network.c b/src/surf/network.c index 5f2960d120..4377c0ef5e 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -32,10 +32,11 @@ static void create_routing_table(void) static void network_link_free(void *nw_link) { + xbt_free(((network_link_t)nw_link)->name); xbt_free(nw_link); } -static network_link_t network_link_new(const char *name, +static network_link_t network_link_new(char *name, double bw_initial, tmgr_trace_t bw_trace, double lat_initial, @@ -70,7 +71,13 @@ static network_link_t network_link_new(const char *name, return nw_link; } -static int network_card_new(const char *card_name) +static void network_card_free(void *nw_card) +{ + xbt_free(((network_card_t)nw_card)->name); + xbt_free(nw_card); +} + +static int network_card_new(char *card_name) { network_card_t card = NULL; @@ -80,7 +87,7 @@ static int network_card_new(const char *card_name) card = xbt_new0(s_network_card_t, 1); card->name = xbt_strdup(card_name); card->id = card_number++; - xbt_dict_set(network_card_set, card_name, card, NULL); + xbt_dict_set(network_card_set, card_name, card, network_card_free); } return card->id; } @@ -293,11 +300,20 @@ static void action_change_state(surf_action_t action, static double share_resources(double now) { - s_surf_action_network_t action; - return generic_maxmin_share_resources(surf_network_resource-> - common_public->states. - running_action_set, - xbt_swag_offset(action, variable)); + s_surf_action_network_t s_action; + surf_action_network_t action = NULL; + xbt_swag_t running_actions = surf_network_resource->common_public->states.running_action_set; + double min = generic_maxmin_share_resources(running_actions, + xbt_swag_offset(s_action, variable)); + + xbt_swag_foreach(action, running_actions) { + if(action->latency>0) { + if(min<0) min = action->latency; + else if (action->latencylatency; + } + } + + return min; } @@ -321,6 +337,8 @@ static void update_actions_state(double now, double delta) deltap -= action->latency; action->latency = 0.0; } + if (action->latency == 0.0) + lmm_update_variable_weight(maxmin_system, action->variable, 1.0); } action->generic_action.remains -= lmm_variable_getvalue(action->variable) * deltap; @@ -424,23 +442,31 @@ static surf_action_t communicate(void *src, void *dst, double size) xbt_swag_insert(action, action->generic_action.state_set); - action->variable = lmm_variable_new(maxmin_system, action, 1.0, -1.0, - route_size); - for (i = 0; i < route_size; i++) - lmm_expand(maxmin_system, route[i]->constraint, action->variable, 1.0); - action->latency = 0.0; for (i = 0; i < route_size; i++) action->latency += route[i]->lat_current; action->lat_current = action->latency; + + if(action->latency>0) + action->variable = lmm_variable_new(maxmin_system, action, 0.0, -1.0, + route_size); + else + action->variable = lmm_variable_new(maxmin_system, action, 1.0, -1.0, + route_size); + lmm_update_variable_bound(maxmin_system, action->variable, SG_TCP_CTE_GAMMA / action->lat_current); + for (i = 0; i < route_size; i++) + lmm_expand(maxmin_system, route[i]->constraint, action->variable, 1.0); + return (surf_action_t) action; } static void finalize(void) { + int i,j; + xbt_dict_free(&network_card_set); xbt_dict_free(&network_link_set); xbt_swag_free(surf_network_resource->common_public->states. @@ -457,6 +483,15 @@ static void finalize(void) xbt_free(surf_network_resource); surf_network_resource = NULL; + + for (i = 0; i < card_number; i++) + for (j = 0; j < card_number; j++) + xbt_free(ROUTE(i,j)); + xbt_free(routing_table); + routing_table = NULL; + xbt_free(routing_table_size); + routing_table_size = NULL; + card_number = 0; } static void surf_network_resource_init_internal(void) diff --git a/src/surf/network_private.h b/src/surf/network_private.h index e873b07f0f..45566924ac 100644 --- a/src/surf/network_private.h +++ b/src/surf/network_private.h @@ -21,7 +21,7 @@ typedef struct network_link { should start by this field!!! */ /* Using this object with the public part of resource does not make sense */ - const char *name; + char *name; double bw_current; tmgr_trace_event_t bw_event; double lat_current; @@ -33,7 +33,7 @@ typedef struct network_link { typedef struct network_card { - const char *name; + char *name; int id; } s_network_card_t, *network_card_t; diff --git a/src/surf/surf.c b/src/surf/surf.c index 6daa250ad3..ce50a00284 100644 --- a/src/surf/surf.c +++ b/src/surf/surf.c @@ -141,6 +141,7 @@ void surf_finalize(void) xbt_dynar_free(&resource_list); tmgr_finalize(); + surf_parse_lex_destroy(); } double surf_solve(void) @@ -186,7 +187,7 @@ double surf_solve(void) } if (min < 0.0) - return 0.0; + return -1.0; while ((next_event_date = tmgr_history_next_date(history)) != -1.0) { if (next_event_date > NOW + min) diff --git a/src/surf/workstation.c b/src/surf/workstation.c index c687495329..19cdad3be0 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -30,6 +30,12 @@ static workstation_t workstation_new(const char *name, return workstation; } +static void workstation_free(void *workstation) +{ + xbt_free(((workstation_t)workstation)->name); + xbt_free(workstation); +} + static void create_workstations(void) { xbt_dict_cursor_t cursor = NULL; @@ -42,7 +48,7 @@ static void create_workstations(void) xbt_dict_get(network_card_set, name, (void *) &nw_card); xbt_assert0(nw_card, "No corresponding card found"); xbt_dict_set(workstation_set, name, - workstation_new(name, cpu, nw_card), NULL); + workstation_new(name, cpu, nw_card), workstation_free); } } @@ -137,10 +143,11 @@ static void action_resume(surf_action_t action) static int action_is_suspended(surf_action_t action) { - xbt_assert0(action->resource_type == - ((surf_resource_t) surf_cpu_resource), - "Resource type mismatch"); - return surf_cpu_resource->extension_public->is_suspended(action); + if(action->resource_type==(surf_resource_t)surf_network_resource) + return 0; + if(action->resource_type==(surf_resource_t)surf_cpu_resource) + return surf_cpu_resource->extension_public->is_suspended(action); + DIE_IMPOSSIBLE; } static surf_action_t communicate(void *workstation_src, @@ -159,6 +166,20 @@ static e_surf_cpu_state_t get_state(void *workstation) static void finalize(void) { + xbt_dict_free(&workstation_set); + xbt_swag_free(surf_workstation_resource->common_public->states.ready_action_set); + xbt_swag_free(surf_workstation_resource->common_public->states. + running_action_set); + xbt_swag_free(surf_workstation_resource->common_public->states. + failed_action_set); + xbt_swag_free(surf_workstation_resource->common_public->states.done_action_set); + + xbt_free(surf_workstation_resource->common_public); + xbt_free(surf_workstation_resource->common_private); + xbt_free(surf_workstation_resource->extension_public); + + xbt_free(surf_workstation_resource); + surf_workstation_resource = NULL; } static void surf_workstation_resource_init_internal(void) diff --git a/src/surf/workstation_private.h b/src/surf/workstation_private.h index d3e656ff9d..f0fe58ec5b 100644 --- a/src/surf/workstation_private.h +++ b/src/surf/workstation_private.h @@ -13,7 +13,7 @@ typedef struct workstation { surf_resource_t resource; /* Any such object, added in a trace should start by this field!!! */ - const char *name; + char *name; void *cpu; void *network_card; } s_workstation_t, *workstation_t;