X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bd6a1bd164a0acbb52a1cf49e2ee65cae4e2b07b..56487520f3dbeda88bec8d16a24a002735e80291:/src/surf/maxmin.c diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index 846dde0e05..b266a3ddea 100644 --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -8,11 +8,16 @@ #include "xbt/sysdep.h" #include "xbt/log.h" +#include "xbt/mallocator.h" #include "maxmin_private.h" #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_maxmin, surf, "Logging specific to SURF (maxmin)"); +static void* lmm_variable_mallocator_new_f(void); +static void lmm_variable_mallocator_free_f(void *var); +static void lmm_variable_mallocator_reset_f(void *var); + lmm_system_t lmm_system_new(void) { lmm_system_t l = NULL; @@ -35,6 +40,11 @@ lmm_system_t lmm_system_new(void) xbt_swag_init(&(l->saturated_constraint_set), xbt_swag_offset(cnst, saturated_constraint_set_hookup)); + l->variable_mallocator = xbt_mallocator_new(64, + lmm_variable_mallocator_new_f, + lmm_variable_mallocator_free_f, + lmm_variable_mallocator_reset_f); + return l; } @@ -49,6 +59,7 @@ void lmm_system_free(lmm_system_t sys) while ((cnst = extract_constraint(sys))) lmm_cnst_free(sys, cnst); + xbt_mallocator_free(sys->variable_mallocator); free(sys); } @@ -75,9 +86,8 @@ static void lmm_var_free(lmm_system_t sys, lmm_variable_t var) { lmm_variable_disable(sys, var); - memset(var->cnsts,0,var->cnsts_size*sizeof(s_lmm_element_t)); free(var->cnsts); - free(var); + xbt_mallocator_release(sys->variable_mallocator, var); } static void lmm_cnst_free(lmm_system_t sys, lmm_constraint_t cnst) @@ -120,6 +130,19 @@ void lmm_constraint_free(lmm_system_t sys, lmm_constraint_t cnst) lmm_cnst_free(sys, cnst); } +static void* lmm_variable_mallocator_new_f(void) { + return xbt_new(s_lmm_variable_t, 1); +} + +static void lmm_variable_mallocator_free_f(void *var) { + xbt_free(var); +} + +static void lmm_variable_mallocator_reset_f(void *var) { + /* memset to zero like calloc */ + memset(var, 0, sizeof(s_lmm_variable_t)); +} + lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id, double weight, double bound, int number_of_constraints) @@ -130,7 +153,7 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id, XBT_IN5("(sys=%p, id=%p, weight=%f, bound=%f, num_cons =%d)", sys,id,weight,bound,number_of_constraints); - var = xbt_new0(s_lmm_variable_t, 1); + var = xbt_mallocator_get(sys->variable_mallocator); var->id = id; var->cnsts = xbt_new0(s_lmm_element_t, number_of_constraints); for(i=0; ibound), "Incorrect value (%f is not smaller than %f)", - sumn,cnst->bound); + sum,cnst->bound); } /* Printing Result */ @@ -442,8 +465,8 @@ void lmm_solve(lmm_system_t sys) elem = &var->cnsts[i]; cnst = elem->constraint; if(cnst->shared) { - cnst->remaining -= elem->value * var->value; - cnst->usage -= elem->value / var->weight; + double_update(&(cnst->remaining), elem->value * var->value); + double_update(&(cnst->usage), elem->value / var->weight); } make_elem_inactive(elem); }