X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/48eccb2c1532e35819830ca56fad7cf89887359f..3811869b798996bc777e7262a42b531d044716c9:/src/smpi/smpi_mpi_dt.cpp diff --git a/src/smpi/smpi_mpi_dt.cpp b/src/smpi/smpi_mpi_dt.cpp index 3463eb8a44..6e6410f279 100644 --- a/src/smpi/smpi_mpi_dt.cpp +++ b/src/smpi/smpi_mpi_dt.cpp @@ -179,6 +179,7 @@ int smpi_datatype_dup(MPI_Datatype datatype, MPI_Datatype* new_t) *new_t= xbt_new(s_smpi_mpi_datatype_t,1); memcpy(*new_t, datatype, sizeof(s_smpi_mpi_datatype_t)); (*new_t)->in_use=1; + (*new_t)->flags &= ~DT_FLAG_PREDEFINED; if (datatype->sizeof_substruct){ (*new_t)->substruct=xbt_malloc(datatype->sizeof_substruct); memcpy((*new_t)->substruct, datatype->substruct, datatype->sizeof_substruct); @@ -200,6 +201,7 @@ int smpi_datatype_dup(MPI_Datatype datatype, MPI_Datatype* new_t) if(ret!=MPI_SUCCESS){ smpi_datatype_unuse(*new_t); *new_t=MPI_DATATYPE_NULL; + xbt_dict_cursor_free(&cursor); return ret; } if(flag) @@ -235,6 +237,8 @@ void smpi_datatype_get_name(MPI_Datatype datatype, char* name, int* length){ } void smpi_datatype_set_name(MPI_Datatype datatype, char* name){ + if(datatype->name!=NULL && !(datatype->flags & DT_FLAG_PREDEFINED)) + xbt_free(datatype->name); datatype->name = xbt_strdup(name);; } @@ -387,6 +391,15 @@ void smpi_datatype_create(MPI_Datatype* new_type, int size,int lb, int ub, int s void smpi_datatype_free(MPI_Datatype* type){ xbt_assert((*type)->in_use >= 0); + + if((*type)->flags & DT_FLAG_PREDEFINED)return; + + //if still used, mark for deletion + if((*type)->in_use!=0){ + (*type)->flags |=DT_FLAG_DESTROYED; + return; + } + if((*type)->attributes !=NULL){ xbt_dict_cursor_t cursor = NULL; int* key; @@ -398,23 +411,15 @@ void smpi_datatype_free(MPI_Datatype* type){ if(elem && elem->delete_fn) elem->delete_fn(*type,*key, value, &flag); } - } - - if((*type)->flags & DT_FLAG_PREDEFINED)return; - - //if still used, mark for deletion - if((*type)->in_use!=0){ - (*type)->flags |=DT_FLAG_DESTROYED; - return; + xbt_dict_free(&(*type)->attributes); } if ((*type)->sizeof_substruct != 0){ //((s_smpi_subtype_t *)(*type)->substruct)->subtype_free(type); xbt_free((*type)->substruct); } - if ((*type)->name != NULL){ - xbt_free((*type)->name); - } + xbt_free((*type)->name); + xbt_free(*type); *type = MPI_DATATYPE_NULL; } @@ -440,11 +445,7 @@ void smpi_datatype_unuse(MPI_Datatype type){ } if(type && type->in_use == 0){ - MPI_Datatype t = type; - if (!(type->flags & DT_FLAG_DESTROYED)) - smpi_datatype_free(&type); - if(t->flags & DT_FLAG_PREDEFINED) return; - xbt_free(t); + smpi_datatype_free(&type); } #if HAVE_MC if(MC_is_active()) @@ -488,17 +489,18 @@ void unserialize_contiguous(const void *contiguous_vector, void *noncontiguous_v } void free_contiguous(MPI_Datatype* d){ - smpi_datatype_unuse(((s_smpi_mpi_indexed_t *)(*d)->substruct)->old_type); + smpi_datatype_unuse(((s_smpi_mpi_contiguous_t *)(*d)->substruct)->old_type); } void use_contiguous(MPI_Datatype* d){ - smpi_datatype_use(((s_smpi_mpi_indexed_t *)(*d)->substruct)->old_type); + smpi_datatype_use(((s_smpi_mpi_contiguous_t *)(*d)->substruct)->old_type); } /* Create a Sub type contiguous to be able to serialize and unserialize it the structure s_smpi_mpi_contiguous_t is * erived from s_smpi_subtype which required the functions unserialize and serialize */ s_smpi_mpi_contiguous_t* smpi_datatype_contiguous_create( MPI_Aint lb, int block_count, MPI_Datatype old_type, int size_oldtype){ + if(block_count==0)return NULL; s_smpi_mpi_contiguous_t *new_t= xbt_new(s_smpi_mpi_contiguous_t,1); new_t->base.serialize = &serialize_contiguous; new_t->base.unserialize = &unserialize_contiguous; @@ -650,11 +652,11 @@ s_smpi_mpi_hvector_t* smpi_datatype_hvector_create( MPI_Aint block_stride, int b //do nothing for vector types void free_hvector(MPI_Datatype* d){ - smpi_datatype_unuse(((s_smpi_mpi_indexed_t *)(*d)->substruct)->old_type); + smpi_datatype_unuse(((s_smpi_mpi_hvector_t *)(*d)->substruct)->old_type); } void use_hvector(MPI_Datatype* d){ - smpi_datatype_use(((s_smpi_mpi_indexed_t *)(*d)->substruct)->old_type); + smpi_datatype_use(((s_smpi_mpi_hvector_t *)(*d)->substruct)->old_type); } int smpi_datatype_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type) @@ -915,7 +917,7 @@ void free_hindexed(MPI_Datatype* type){ } void use_hindexed(MPI_Datatype* type){ - smpi_datatype_use(((s_smpi_mpi_indexed_t *)(*type)->substruct)->old_type); + smpi_datatype_use(((s_smpi_mpi_hindexed_t *)(*type)->substruct)->old_type); } /* Create a Sub type hindexed to be able to serialize and unserialize it the structure s_smpi_mpi_hindexed_t is derived