-void gras_ddt_free(gras_datadesc_type_t **type) {
- gras_datadesc_type_t *t;
-
- if (type && *type) {
- t=*type;
-
- free(t->name);
- switch (t->category_code) {
- case e_gras_datadesc_type_cat_scalar:
- case e_gras_datadesc_type_cat_ref:
- case e_gras_datadesc_type_cat_array:
- /* nothing to free in there */
- 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);
+void gras_datadesc_cb_send (gras_datadesc_type_t type,
+ gras_datadesc_type_cb_void_t send) {
+ type->send = send;
+}
+/**
+ * gras_datadesc_cb_recv:
+ *
+ * Add a post-receive callback to this datadesc.
+ * (useful to put the function pointers to the rigth value, for example)
+ */
+void gras_datadesc_cb_recv(gras_datadesc_type_t type,
+ gras_datadesc_type_cb_void_t recv) {
+ type->recv = recv;
+}
+/**
+ * gras_dd_find_field:
+ *
+ * Returns the type descriptor of the given field. Abort on error.
+ */
+static gras_datadesc_type_t
+ gras_dd_find_field(gras_datadesc_type_t type,
+ const char *field_name) {
+ gras_datadesc_type_t sub_type=NULL;
+ xbt_dynar_t field_array;
+
+ gras_dd_cat_field_t field=NULL;
+ int field_num;
+
+ if (type->category_code == e_gras_datadesc_type_cat_union) {
+ field_array = type->category.union_data.fields;
+ } else if (type->category_code == e_gras_datadesc_type_cat_struct) {
+ field_array = type->category.struct_data.fields;
+ } else {
+ ERROR2("%s (%p) is not a struct nor an union. There is no field.", type->name,(void*)type);
+ xbt_abort();
+ }
+ xbt_dynar_foreach(field_array,field_num,field) {
+ if (!strcmp(field_name,field->name)) {
+ return field->type;