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
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,
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;
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;
}
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);
}
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);
}
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);
}
{
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));
}
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 {
#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)
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,
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;
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;
}
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;
}
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;
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.
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)
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;
typedef struct network_card {
- const char *name;
+ char *name;
int id;
} s_network_card_t, *network_card_t;
xbt_dynar_free(&resource_list);
tmgr_finalize();
+ surf_parse_lex_destroy();
}
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)
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;
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);
}
}
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,
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)
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;