X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5eb045085f187501764ffeae1e28987c21816f69..173afc59b0ae997390f2d80e2d054838eaf71a93:/src/gras/DataDesc/ddt_exchange.c diff --git a/src/gras/DataDesc/ddt_exchange.c b/src/gras/DataDesc/ddt_exchange.c index 075cffd4c5..c90975cb68 100644 --- a/src/gras/DataDesc/ddt_exchange.c +++ b/src/gras/DataDesc/ddt_exchange.c @@ -10,7 +10,7 @@ #include "DataDesc/datadesc_private.h" -GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(exchange,DataDesc); +GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(exchange,datadesc); const char *gras_datadesc_cat_names[9] = { "undefined", @@ -43,7 +43,8 @@ gras_datadesc_recv_rec(gras_socket_t *sock, int r_arch, char **r_data, long int r_lgr, - char *dst); + char *dst, + int subsize); static gras_error_t @@ -69,12 +70,12 @@ gras_dd_recv_int(gras_socket_t *sock, int r_arch, int *i) { if (int_type->size[GRAS_THISARCH] >= int_type->size[r_arch]) { TRY(gras_trp_chunk_recv(sock, (char*)i, int_type->size[r_arch])); - TRY(gras_dd_convert_elm(int_type,r_arch, i,i)); + TRY(gras_dd_convert_elm(int_type,1,r_arch, i,i)); } else { void *ptr = NULL; ptr = malloc((size_t)int_type->size[r_arch]); TRY(gras_trp_chunk_recv(sock, (char*)ptr, int_type->size[r_arch])); - TRY(gras_dd_convert_elm(int_type,r_arch, ptr,i)); + TRY(gras_dd_convert_elm(int_type,1,r_arch, ptr,i)); free(ptr); } DEBUG1("recv_int(%d)",*i); @@ -329,18 +330,26 @@ gras_datadesc_send_rec(gras_socket_t *sock, gras_dd_cat_struct_t struct_data; gras_dd_cat_field_t *field; char *field_data; - + struct_data = type->category.struct_data; + gras_assert1(struct_data.closed, + "Please call gras_datadesc_declare_struct_close on %s before sending it", + type->name); VERB1(">> Send all fields of the structure %s",type->name); gras_dynar_foreach(struct_data.fields, cpt, field) { field_data = data; field_data += field->offset[GRAS_THISARCH]; - TRY(gras_datadesc_by_id(field->code, &sub_type)); + errcode=gras_datadesc_by_id(field->code, &sub_type); + if (errcode != no_error) + RAISE4(errcode, + "Got %s while searching for the sub type %d, #%d of %s", + gras_error_name(errcode),field->code,cpt,type->name); if (field->pre) field->pre(state,sub_type,field_data); + VERB1("Send field %s",field->name); TRY(gras_datadesc_send_rec(sock,state,refs,sub_type, field_data)); if (field->post) @@ -358,6 +367,9 @@ gras_datadesc_send_rec(gras_socket_t *sock, union_data = type->category.union_data; + gras_assert1(union_data.closed, + "Please call gras_datadesc_declare_union_close on %s before sending it", + type->name); /* retrieve the field number */ field_num = union_data.selector(state, type, data); @@ -453,9 +465,15 @@ gras_datadesc_send_rec(gras_socket_t *sock, /* send the content */ TRY(gras_datadesc_by_id(array_data.code, &sub_type)); elm_size = sub_type->aligned_size[GRAS_THISARCH]; - for (cpt=0; cptcategory_code == e_gras_datadesc_type_cat_scalar) { + VERB1("Array of %d scalars, send it in one shoot",count); + TRY(gras_trp_chunk_send(sock, data, + sub_type->aligned_size[GRAS_THISARCH] * count)); + } else { + for (cpt=0; cptcategory_code) { case e_gras_datadesc_type_cat_scalar: - if (type->size[GRAS_THISARCH] >= type->size[r_arch]) { + if (type->size[GRAS_THISARCH] == type->size[r_arch]) { TRY(gras_trp_chunk_recv(sock, (char*)l_data, type->size[r_arch])); - TRY(gras_dd_convert_elm(type,r_arch, l_data,l_data)); + TRY(gras_dd_convert_elm(type,1,r_arch, l_data,l_data)); } else { void *ptr = NULL; ptr = malloc((size_t)type->size[r_arch]); TRY(gras_trp_chunk_recv(sock, (char*)ptr, type->size[r_arch])); - TRY(gras_dd_convert_elm(type,r_arch, ptr,l_data)); + TRY(gras_dd_convert_elm(type,1,r_arch, ptr,l_data)); free(ptr); } break; @@ -538,6 +564,9 @@ gras_datadesc_recv_rec(gras_socket_t *sock, struct_data = type->category.struct_data; + gras_assert1(struct_data.closed, + "Please call gras_datadesc_declare_struct_close on %s before receiving it", + type->name); VERB1(">> Receive all fields of the structure %s",type->name); gras_dynar_foreach(struct_data.fields, cpt, field) { char *field_data = l_data + field->offset[GRAS_THISARCH]; @@ -546,7 +575,7 @@ gras_datadesc_recv_rec(gras_socket_t *sock, TRY(gras_datadesc_recv_rec(sock,state,refs, sub_type, r_arch,NULL,0, - field_data)); + field_data,-1)); } VERB1("<< Received all fields of the structure %s", type->name); @@ -560,6 +589,9 @@ gras_datadesc_recv_rec(gras_socket_t *sock, union_data = type->category.union_data; + gras_assert1(union_data.closed, + "Please call gras_datadesc_declare_union_close on %s before receiving it", + type->name); /* retrieve the field number */ TRY(gras_dd_recv_int(sock, r_arch, &field_num)); if (field_num < 0) @@ -576,7 +608,7 @@ gras_datadesc_recv_rec(gras_socket_t *sock, TRY(gras_datadesc_recv_rec(sock,state,refs, sub_type, r_arch,NULL,0, - l_data)); + l_data,-1)); break; } @@ -618,27 +650,45 @@ gras_datadesc_recv_rec(gras_socket_t *sock, if (errcode == mismatch_error) { + int subsubcount = -1; void *l_referenced=NULL; TRY(gras_datadesc_by_id(ref_code, &sub_type)); - VERB1("Receiving '%s' ",sub_type->name); - TRY(gras_dd_alloc_ref(refs,sub_type->size[GRAS_THISARCH], - r_ref,pointer_type->size[r_arch], (char**)&l_referenced)); - - VERB2("Receiving '%s' remotely referenced at %p", + VERB2("Receiving a ref to '%s', remotely @%p", sub_type->name, *(void**)r_ref); + if (sub_type->category_code == e_gras_datadesc_type_cat_array) { + /* Damn. Reference to a dynamic array. Allocating the size for it + is more complicated */ + gras_dd_cat_array_t array_data = sub_type->category.array_data; + gras_datadesc_type_t *subsub_type; + + subsubcount = array_data.fixed_size; + if (subsubcount < 0) + TRY(gras_dd_recv_int(sock, r_arch, &subsubcount)); + + TRY(gras_datadesc_by_id(array_data.code, &subsub_type)); + + + TRY(gras_dd_alloc_ref(refs, + subsub_type->size[GRAS_THISARCH] * subsubcount, + r_ref,pointer_type->size[r_arch], + (char**)&l_referenced)); + } else { + TRY(gras_dd_alloc_ref(refs,sub_type->size[GRAS_THISARCH], + r_ref,pointer_type->size[r_arch], + (char**)&l_referenced)); + } - // DEBUG2("l_ref= %p; &l_ref=%p",l_referenced,&l_referenced); TRY(gras_datadesc_recv_rec(sock,state,refs, sub_type, r_arch,r_ref,pointer_type->size[r_arch], - (char*)l_referenced)); + (char*)l_referenced, subsubcount)); *(void**)l_data=l_referenced; VERB3("'%s' remotely referenced at %p locally at %p", sub_type->name, *(void**)r_ref, l_referenced); } else if (errcode == no_error) { - VERB2("NOT receiving data remotely referenced @%p (already done, locally @%p). ", + VERB2("NOT receiving data remotely referenced @%p (already done, @%p here)", *(void**)r_ref, *(void**)l_ref); *(void**)l_data=*l_ref; @@ -657,9 +707,11 @@ gras_datadesc_recv_rec(gras_socket_t *sock, long int elm_size; array_data = type->category.array_data; - /* determine element count locally or from peer */ + /* determine element count locally, or from caller, or from peer */ count = array_data.fixed_size; if (count <= 0) + count = subsize; + if (count < 0) TRY(gras_dd_recv_int(sock, r_arch, &count)); if (count < 0) RAISE1(mismatch_error, @@ -667,18 +719,31 @@ gras_datadesc_recv_rec(gras_socket_t *sock, /* receive the content */ TRY(gras_datadesc_by_id(array_data.code, &sub_type)); - elm_size = sub_type->aligned_size[GRAS_THISARCH]; - VERB2("Receive a %d-long array of %s",count, sub_type->name); - - if (!l_data) { - TRY(gras_dd_alloc_ref(refs,elm_size*count,r_data,r_lgr, &l_data)); - } - - ptr = l_data; - for (cpt=0; cptcategory_code == e_gras_datadesc_type_cat_scalar) { + VERB1("Array of %d scalars, get it in one shoot", count); + if (sub_type->aligned_size[GRAS_THISARCH] >= + sub_type->aligned_size[r_arch]) { + TRY(gras_trp_chunk_recv(sock, (char*)l_data, + sub_type->aligned_size[r_arch] * count)); + TRY(gras_dd_convert_elm(sub_type,count,r_arch, l_data,l_data)); + } else { + ptr = malloc((size_t)sub_type->aligned_size[r_arch] * count); + TRY(gras_trp_chunk_recv(sock, (char*)ptr, + sub_type->size[r_arch] * count)); + TRY(gras_dd_convert_elm(sub_type,count,r_arch, ptr,l_data)); + free(ptr); + } + } else { + /* not scalar content, get it recursively (may contain pointers) */ + elm_size = sub_type->aligned_size[GRAS_THISARCH]; + VERB2("Receive a %d-long array of %s",count, sub_type->name); + + ptr = l_data; + for (cpt=0; cpt