From: alegrand Date: Mon, 29 Nov 2004 18:45:39 +0000 (+0000) Subject: Rha! X-Git-Tag: v3.3~4822 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/24b8008bb424160e633b1374f54dcd89bdcb9749?ds=sidebyside Rha! surf:~/Work/GRAS/heap $ valgrind --num-callers=8 --show-reachable=yes --leak-check=yes --db-attach=yes ./surf_usage ==28483== Memcheck, a memory error detector for x86-linux. ==28483== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al. ==28483== Using valgrind-2.2.0, a program supervision framework for x86-linux. ==28483== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al. ==28483== For more details, rerun with: -v ==28483== 0x1bac5a40 Cpu A : 0x1bac6b10 Cpu B : 0x1bac6e10 actionA : 0x1bac7140 (SURF_ACTION_RUNNING) actionB : 0x1bac7288 (SURF_ACTION_RUNNING) [0] Asking to update "Cpu A" with value 1 for event 0x1bac6b70 [0] Asking to update "Cpu B" with value 1 for event 0x1bac6e70 [0] Asking to update "Cpu A" with value -1 for event 0x1bac6bb0 Next Event : 0 Failed : 0x1bac7140 [0] Asking to update "Cpu A" with value 1 for event 0x1bac6bb0 Next Event : 1 Next Event : 10 Done : 0x1bac7288 Simulation Terminated ==28483== ==28483== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 1) ==28483== malloc/free: in use at exit: 0 bytes in 0 blocks. ==28483== malloc/free: 77 allocs, 77 frees, 5279 bytes allocated. ==28483== For counts of detected errors, rerun with: -v ==28483== No malloc'd blocks -- no leaks are possible. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@528 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/include/xbt/swag.h b/include/xbt/swag.h index 1cfe70d6fc..c8a7331e0e 100644 --- a/include/xbt/swag.h +++ b/include/xbt/swag.h @@ -26,6 +26,7 @@ typedef struct xbt_swag { } s_xbt_swag_t, *xbt_swag_t; xbt_swag_t xbt_swag_new(size_t offset); +void xbt_swag_free(xbt_swag_t swag); void xbt_swag_init(xbt_swag_t swag, size_t offset); void xbt_swag_insert(void *obj, xbt_swag_t swag); void *xbt_swag_remove(void *obj, xbt_swag_t swag); diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index c4fbe62309..5bda063d4b 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -60,7 +60,7 @@ typedef struct surf_resource_public { int (*resource_used)(void *resource_id); e_surf_action_state_t (*action_get_state)(surf_action_t action); - void (*action_free)(surf_action_t * action); + void (*action_free)(surf_action_t action); void (*action_cancel)(surf_action_t action); void (*action_recycle)(surf_action_t action); void (*action_change_state)(surf_action_t action, @@ -127,5 +127,6 @@ xbt_heap_float_t surf_solve(void); /* update all states and returns the time elapsed since last event */ xbt_heap_float_t surf_get_clock(void); +void surf_finalize(void); /* clean everything */ #endif /* _SURF_SURF_H */ diff --git a/src/include/surf/trace_mgr.h b/src/include/surf/trace_mgr.h index 4a3be6b88e..87999db8da 100644 --- a/src/include/surf/trace_mgr.h +++ b/src/include/surf/trace_mgr.h @@ -32,4 +32,6 @@ tmgr_trace_event_t tmgr_history_get_next_event_leq(tmgr_history_t history, xbt_maxmin_float_t * value, void **resource); +void tmgr_finalize(void); + #endif /* _SURF_TMGR_H */ 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) diff --git a/src/surf/surf.c b/src/surf/surf.c index 5be1d870d2..41648deced 100644 --- a/src/surf/surf.c +++ b/src/surf/surf.c @@ -59,6 +59,28 @@ void surf_init(void) if(!maxmin_system) maxmin_system = lmm_system_new(); } +void surf_finalize(void) +{ + int i; + surf_resource_t resource = NULL; + + xbt_dynar_foreach (resource_list,i,resource) { + resource->common_private->finalize(); + } + + if(maxmin_system) { + lmm_system_free(maxmin_system); + maxmin_system = NULL; + } + if(history) { + tmgr_history_free(history); + history = NULL; + } + if(resource_list) xbt_dynar_free(&resource_list); + + tmgr_finalize(); +} + xbt_heap_float_t surf_solve(void) { static int first_run = 1; diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index e808d3fb51..590afa87ac 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -9,6 +9,7 @@ #include "surf/surf.h" #include "surf/maxmin.h" #include "surf/trace_mgr.h" +#include "xbt/log.h" typedef struct surf_resource_private { /* Share the resources to the actions and return in hom much time @@ -17,6 +18,7 @@ typedef struct surf_resource_private { /* Update the actions' state */ void (*update_actions_state) (xbt_heap_float_t now, xbt_heap_float_t delta); void (*update_resource_state) (void *id,tmgr_trace_event_t event_type, xbt_maxmin_float_t value); + void (*finalize)(void); } s_surf_resource_private_t; /* #define pub2priv(r) ((surf_resource_private_t) ((char *)(r) -(sizeof(struct surf_resource_private_part)))) */ diff --git a/src/surf/trace_mgr.c b/src/surf/trace_mgr.c index e16eccc854..c7a78a0c66 100644 --- a/src/surf/trace_mgr.c +++ b/src/surf/trace_mgr.c @@ -192,3 +192,8 @@ tmgr_trace_event_t tmgr_history_get_next_event_leq(tmgr_history_t history, return trace_event; } + +void tmgr_finalize(void) +{ + xbt_dict_free(&trace_list); +} diff --git a/src/xbt/fifo.c b/src/xbt/fifo.c index 2f191af958..cb50c60391 100644 --- a/src/xbt/fifo.c +++ b/src/xbt/fifo.c @@ -7,6 +7,8 @@ #include "xbt/error.h" #include "fifo_private.h" +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(fifo,xbt,"FIFO"); + /* * xbt_fifo_new() */ diff --git a/src/xbt/heap.c b/src/xbt/heap.c index 394056d779..e30291fa9a 100644 --- a/src/xbt/heap.c +++ b/src/xbt/heap.c @@ -8,6 +8,7 @@ #include "xbt/sysdep.h" #include "xbt/error.h" #include "heap_private.h" +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(heap,xbt,"Heap"); /** * xbt_heap_new: diff --git a/src/xbt/log.c b/src/xbt/log.c index 595576add4..a5a73480db 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -52,6 +52,7 @@ s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT) = { XBT_LOG_NEW_SUBCATEGORY(gras,XBT_LOG_ROOT_CAT,"All GRAS categories"); XBT_LOG_NEW_SUBCATEGORY(xbt,XBT_LOG_ROOT_CAT,"All XBT categories (gras toolbox)"); +XBT_LOG_NEW_SUBCATEGORY(surf,XBT_LOG_ROOT_CAT,"All SURF categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(log,xbt,"Loggings from the logging mecanism itself"); diff --git a/src/xbt/swag.c b/src/xbt/swag.c index 9cc8cecab9..5b2f758a08 100644 --- a/src/xbt/swag.c +++ b/src/xbt/swag.c @@ -13,11 +13,13 @@ #include "xbt/error.h" #include "xbt/swag.h" +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(swag,xbt,"Swag : O(1) set library"); + #define PREV(obj,offset) xbt_swag_getPrev(obj,offset) #define NEXT(obj,offset) xbt_swag_getNext(obj,offset) /* - Usage : xbt_swag_new(&obj.setA-&obj.setA); + Usage : xbt_swag_new(&obj.setA-&obj); */ xbt_swag_t xbt_swag_new(size_t offset) @@ -29,6 +31,12 @@ xbt_swag_t xbt_swag_new(size_t offset) return swag; } + +void xbt_swag_free(xbt_swag_t swag) +{ + xbt_free(swag); +} + void xbt_swag_init(xbt_swag_t swag, size_t offset) { swag->offset = offset; diff --git a/testsuite/surf/surf_usage.c b/testsuite/surf/surf_usage.c index 72fd63556f..622c9bd117 100644 --- a/testsuite/surf/surf_usage.c +++ b/testsuite/surf/surf_usage.c @@ -69,13 +69,17 @@ void test(void) printf("Next Event : " XBT_HEAP_FLOAT_T "\n", now); while(action=xbt_swag_extract(surf_cpu_resource->common_public->states.failed_action_set)) { printf("\tFailed : %p\n", action); + action->resource_type->common_public->action_free(action); } while(action=xbt_swag_extract(surf_cpu_resource->common_public->states.done_action_set)) { printf("\tDone : %p\n", action); + action->resource_type->common_public->action_free(action); } } while(surf_solve()); printf("Simulation Terminated\n"); + + surf_finalize(); }