From: mquinson Date: Mon, 21 Jun 2004 17:08:48 +0000 (+0000) Subject: Use refcounters on datadescription types so that messages can have pointer to datades... X-Git-Tag: v3.3~5221 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/6b791e21e56ef3f6b98a843dfcefb5bf9815f0c0 Use refcounters on datadescription types so that messages can have pointer to datadescription directly (and not their name), and still deal with multiple creations of the types (in SG, each process create them) and without leaking on them git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@125 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/gras/DataDesc/ddt_create.c b/src/gras/DataDesc/ddt_create.c index d8a4e76f33..82a7ba47f5 100644 --- a/src/gras/DataDesc/ddt_create.c +++ b/src/gras/DataDesc/ddt_create.c @@ -21,7 +21,7 @@ static void gras_ddt_freev(void *ddt) { gras_datadesc_type_t *type= (gras_datadesc_type_t *)ddt; if (type) { - gras_ddt_free(&type); + gras_datadesc_unref(type); } } @@ -30,17 +30,20 @@ gras_ddt_new(const char *name, gras_datadesc_type_t **dst) { gras_error_t errcode; - gras_datadesc_type_t *res=malloc(sizeof(gras_datadesc_type_t)); + gras_datadesc_type_t *res; + + res=malloc(sizeof(gras_datadesc_type_t)); if (!res) RAISE_MALLOC; memset(res, 0, sizeof(gras_datadesc_type_t)); res->name = strdup(name); res->name_len = strlen(name); + res->refcounter = 1; TRY(gras_set_add(gras_datadesc_set_local, (gras_set_elm_t*)res,&gras_ddt_freev)); - + *dst=res; return no_error; } @@ -96,7 +99,7 @@ gras_datadesc_declare_scalar(const char *name, long int sz; long int mask; - res->size[arch] = gras_arch_sizes[arch].sizeof_scalars[type]; + res->size[arch] = gras_arches[arch].sizeof_scalars[type]; sz = res->size[arch]; mask = sz; @@ -148,7 +151,7 @@ gras_datadesc_declare_scalar(const char *name, * Frees one struct or union field */ void gras_dd_cat_field_free(void *f) { - gras_dd_cat_field_t *field = (gras_dd_cat_field_t *)f; + gras_dd_cat_field_t *field = *(gras_dd_cat_field_t **)f; if (field) { if (field->name) free(field->name); @@ -457,18 +460,48 @@ gras_datadesc_import_nws(const char *name, } /** - * gras_ddt_free: + * gras_datadesc_cb_set_pre: * - * Frees a datadescription. + * Add a pre-send callback to this datadexc */ -void gras_ddt_free(gras_datadesc_type_t **type) { - gras_datadesc_type_t *t; +void gras_datadesc_cb_set_pre (gras_datadesc_type_t *type, + gras_datadesc_type_cb_void_t pre) { + type->pre = pre; +} +/** + * gras_datadesc_cb_set_post: + * + * Add a post-send callback to this datadexc + */ +void gras_datadesc_cb_set_post(gras_datadesc_type_t *type, + gras_datadesc_type_cb_void_t post) { + type->post = post; +} - if (type && *type) { - t=*type; +/** + * gras_datadesc_ref: + * + * Adds a reference to the datastruct. + * ddt will be freed only when the refcount becomes 0. + */ +void gras_datadesc_ref(gras_datadesc_type_t *type) { + type->refcounter ++; +} - free(t->name); - switch (t->category_code) { +/** + * gras_datadesc_unref: + * + * Adds a reference to the datastruct. + * ddt will be freed only when the refcount becomes 0. + */ +void gras_datadesc_unref(gras_datadesc_type_t *type) { + type->refcounter--; + if (!type->refcounter) { + /* even the set of ddt released that type. Let's free it */ + DEBUG1("Let's free ddt %s",type->name); + + free(type->name); + switch (type->category_code) { case e_gras_datadesc_type_cat_scalar: case e_gras_datadesc_type_cat_ref: case e_gras_datadesc_type_cat_array: @@ -476,41 +509,24 @@ void gras_ddt_free(gras_datadesc_type_t **type) { break; case e_gras_datadesc_type_cat_ignored: - if (t->category.ignored_data.free_func) { - t->category.ignored_data.free_func(t->category.ignored_data.default_value); + if (type->category.ignored_data.free_func) { + type->category.ignored_data.free_func + (type->category.ignored_data.default_value); } break; case e_gras_datadesc_type_cat_struct: - gras_dynar_free(t->category.struct_data.fields); + gras_dynar_free(type->category.struct_data.fields); break; case e_gras_datadesc_type_cat_union: - gras_dynar_free(t->category.union_data.fields); + gras_dynar_free(type->category.union_data.fields); break; default: /* datadesc was invalid. Killing it is like euthanasy, I guess */ break; } + free(type); } } - -/** - * gras_datadesc_cb_set_pre: - * - * Add a pre-send callback to this datadexc - */ -void gras_datadesc_cb_set_pre (gras_datadesc_type_t *type, - gras_datadesc_type_cb_void_t pre) { - type->pre = pre; -} -/** - * gras_datadesc_cb_set_post: - * - * Add a post-send callback to this datadexc - */ -void gras_datadesc_cb_set_post(gras_datadesc_type_t *type, - gras_datadesc_type_cb_void_t post) { - type->post = post; -}