Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Mem leak hunting!
authoralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 31 Dec 2004 02:49:39 +0000 (02:49 +0000)
committeralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 31 Dec 2004 02:49:39 +0000 (02:49 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@704 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/surf/cpu.c
src/surf/cpu_private.h
src/surf/maxmin.c
src/surf/maxmin_private.h
src/surf/network.c
src/surf/network_private.h
src/surf/surf.c
src/surf/workstation.c
src/surf/workstation_private.h

index ca1056e..a3c4d94 100644 (file)
@@ -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,
index 17715ee..a14ccb5 100644 (file)
@@ -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;
index a346b1f..31d816a 100644 (file)
@@ -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));
 }
 
 
index 7053c9a..2b0ae5f 100644 (file)
@@ -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)
index 5f2960d..4377c0e 100644 (file)
@@ -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->latency<min) min = action->latency;
+    }
+  }
+
+  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)
index e873b07..4556692 100644 (file)
@@ -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;
 
index 6daa250..ce50a00 100644 (file)
@@ -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)
index c687495..19cdad3 100644 (file)
@@ -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)
index d3e656f..f0fe58e 100644 (file)
@@ -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;