X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/15807bea7353de99396547e065c5d33bbf75ce56..24b8008bb424160e633b1374f54dcd89bdcb9749:/src/surf/cpu.c diff --git a/src/surf/cpu.c b/src/surf/cpu.c index 03625353c6..3ac397f202 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -6,10 +6,11 @@ #include "cpu_private.h" #include "xbt/dict.h" +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(cpu, surf ,"Logging specific to the SURF CPU module"); + surf_cpu_resource_t surf_cpu_resource = NULL; static xbt_dict_t cpu_set = NULL; -static lmm_system_t sys = NULL; /* power_scale is the basic power of the cpu when the cpu is completely available. initial_power is therefore expected to be @@ -18,7 +19,16 @@ static lmm_system_t sys = NULL; otherwise. */ -static void *new_cpu(const char *name, xbt_maxmin_float_t power_scale, +static void cpu_free(void *CPU){ + cpu_t cpu = CPU; + +/* lmm_constraint_free(maxmin_system,cpu->constraint); */ +/* Clean somewhere else ! */ + + xbt_free(cpu); +} + +static void *cpu_new(const char *name, xbt_maxmin_float_t power_scale, xbt_maxmin_float_t initial_power, tmgr_trace_t power_trace, e_surf_cpu_state_t initial_state, tmgr_trace_t state_trace) { @@ -37,9 +47,9 @@ static void *new_cpu(const char *name, xbt_maxmin_float_t power_scale, if(state_trace) cpu->state_event = tmgr_history_add_trace(history, state_trace, 0.0, 0, cpu); - cpu->constraint = lmm_constraint_new(sys, cpu, cpu->current_power * cpu->power_scale); + cpu->constraint = lmm_constraint_new(maxmin_system, cpu, cpu->current_power * cpu->power_scale); - xbt_dict_set(cpu_set, name, cpu, NULL); + xbt_dict_set(cpu_set, name, cpu, cpu_free); return cpu; } @@ -50,8 +60,8 @@ static void parse_file(const char *file) tmgr_trace_t trace_B = tmgr_trace_new("trace_B.txt"); tmgr_trace_t trace_A_failure = tmgr_trace_new("trace_A_failure.txt"); - new_cpu("Cpu A", 100.0, 1.0, trace_A, SURF_CPU_ON, trace_A_failure); - new_cpu("Cpu B", 100.0, 1.0, trace_B, SURF_CPU_ON, NULL); + cpu_new("Cpu A", 100.0, 1.0, trace_A, SURF_CPU_ON, trace_A_failure); + cpu_new("Cpu B", 100.0, 1.0, trace_B, SURF_CPU_ON, NULL); } static void *name_service(const char *name) @@ -70,21 +80,17 @@ static const char *get_resource_name(void *resource_id) static int resource_used(void *resource_id) { - return lmm_constraint_used(sys, ((cpu_t)resource_id)->constraint); + return lmm_constraint_used(maxmin_system, ((cpu_t)resource_id)->constraint); } -static surf_action_t action_new(void *callback) +static void action_free(surf_action_t action) { - return NULL; -} + surf_action_cpu_t Action = (surf_action_cpu_t) action; -static e_surf_action_state_t action_get_state(surf_action_t action) -{ - return SURF_ACTION_NOT_IN_THE_SYSTEM; -} + xbt_swag_remove(action,action->state_set); + lmm_variable_free(maxmin_system,Action->variable); + xbt_free(action); -static void action_free(surf_action_t * action) -{ return; } @@ -110,7 +116,7 @@ static xbt_heap_float_t share_resources() xbt_swag_t running_actions= surf_cpu_resource->common_public->states.running_action_set; xbt_maxmin_float_t min = -1; xbt_maxmin_float_t value = -1; - lmm_solve(sys); + lmm_solve(maxmin_system); action = xbt_swag_getFirst(running_actions); if(!action) return 0.0; @@ -142,11 +148,11 @@ static void update_actions_state(xbt_heap_float_t now, action_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 tab_size = lmm_get_number_of_cnst_from_var(sys, action->variable); + int tab_size = lmm_get_number_of_cnst_from_var(maxmin_system, action->variable); int i=0; cpu_t cpu = NULL; - while((cnst=lmm_get_cnst_from_var(sys, action->variable, i++))) { + while((cnst=lmm_get_cnst_from_var(maxmin_system, action->variable, i++))) { cpu = lmm_constraint_id(cnst); if(cpu->current_state==SURF_CPU_OFF) { action_change_state((surf_action_t) action, SURF_ACTION_FAILED); @@ -157,7 +163,7 @@ static void update_actions_state(xbt_heap_float_t now, } xbt_swag_foreach_safe(action, next_action, failed_actions) { - lmm_variable_disable(sys, action->variable); + lmm_variable_disable(maxmin_system, action->variable); } return; @@ -204,8 +210,8 @@ static surf_action_t execute(void *cpu, xbt_maxmin_float_t size) action->generic_action.state_set=surf_cpu_resource->common_public->states.failed_action_set; xbt_swag_insert(action,action->generic_action.state_set); - action->variable = lmm_variable_new(sys, action, 1.0, -1.0, 1); - lmm_expand(sys, ((cpu_t)cpu)->constraint, action->variable, 1.0); + action->variable = lmm_variable_new(maxmin_system, action, 1.0, -1.0, 1); + lmm_expand(maxmin_system, ((cpu_t)cpu)->constraint, action->variable, 1.0); return (surf_action_t) action; } @@ -215,6 +221,21 @@ static e_surf_cpu_state_t get_state(void *cpu) return SURF_CPU_OFF; } +static void finalize(void) +{ + xbt_dict_free(&cpu_set); + xbt_swag_free(surf_cpu_resource->common_public->states.ready_action_set); + xbt_swag_free(surf_cpu_resource->common_public->states.running_action_set); + xbt_swag_free(surf_cpu_resource->common_public->states.failed_action_set); + xbt_swag_free(surf_cpu_resource->common_public->states.done_action_set); + xbt_free(surf_cpu_resource->common_public); + xbt_free(surf_cpu_resource->common_private); + xbt_free(surf_cpu_resource->extension_public); + + xbt_free(surf_cpu_resource); + surf_cpu_resource = NULL; +} + static void surf_cpu_resource_init_internal(void) { s_surf_action_t action; @@ -243,16 +264,18 @@ static void surf_cpu_resource_init_internal(void) surf_cpu_resource->common_public->action_cancel = action_cancel; surf_cpu_resource->common_public->action_recycle = action_recycle; surf_cpu_resource->common_public->action_change_state = action_change_state; + surf_cpu_resource->common_private->share_resources = share_resources; surf_cpu_resource->common_private->update_actions_state = update_actions_state; surf_cpu_resource->common_private->update_resource_state = update_resource_state; + surf_cpu_resource->common_private->finalize = finalize; surf_cpu_resource->extension_public->execute = execute; surf_cpu_resource->extension_public->get_state = get_state; cpu_set = xbt_dict_new(); - sys = lmm_system_new(); + xbt_assert0(maxmin_system,"surf_init has to be called first!"); } void surf_cpu_resource_init(const char* filename)