X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/942fe4d025c46b409f84cbf06e7210a39321d050..e05ceda6c38a3d48b6a6bb9820101803b002e16e:/src/smpi/smpi_mpi_dt.cpp diff --git a/src/smpi/smpi_mpi_dt.cpp b/src/smpi/smpi_mpi_dt.cpp index 7fcda62fd5..36eba9bd54 100644 --- a/src/smpi/smpi_mpi_dt.cpp +++ b/src/smpi/smpi_mpi_dt.cpp @@ -178,6 +178,8 @@ int smpi_datatype_dup(MPI_Datatype datatype, MPI_Datatype* new_t) int ret=MPI_SUCCESS; *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); @@ -197,6 +199,7 @@ int smpi_datatype_dup(MPI_Datatype datatype, MPI_Datatype* new_t) if(elem && elem->copy_fn!=MPI_NULL_COPY_FN){ ret = elem->copy_fn(datatype, *key, NULL, value_in, &value_out, &flag ); if(ret!=MPI_SUCCESS){ + smpi_datatype_unuse(*new_t); *new_t=MPI_DATATYPE_NULL; return ret; } @@ -233,6 +236,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);; } @@ -385,6 +390,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,28 +412,19 @@ void smpi_datatype_free(MPI_Datatype* type){ } } - 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)->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; } void smpi_datatype_use(MPI_Datatype type){ if(type)type->in_use++; -XBT_INFO("using type %p, counter %d ", type, type->in_use); + if(type->sizeof_substruct!=0){ ((s_smpi_subtype_t *)(type)->substruct)->subtype_use(&type); } @@ -433,17 +438,12 @@ void smpi_datatype_unuse(MPI_Datatype type){ if (type->in_use > 0) type->in_use--; -XBT_INFO("unusing type %p, counter %d ", type, type->in_use); if(type->sizeof_substruct!=0){ ((s_smpi_subtype_t *)(type)->substruct)->subtype_free(&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()) @@ -487,11 +487,11 @@ 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 @@ -649,11 +649,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) @@ -777,7 +777,6 @@ s_smpi_mpi_indexed_t* smpi_datatype_indexed_create( int* block_lengths, int* blo new_t->base.unserialize = &unserialize_indexed; new_t->base.subtype_free = &free_indexed; new_t->base.subtype_use = &use_indexed; - //TODO : add a custom function for each time to clean these new_t->block_lengths= xbt_new(int, block_count); new_t->block_indices= xbt_new(int, block_count); int i; @@ -915,7 +914,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 @@ -928,7 +927,6 @@ s_smpi_mpi_hindexed_t* smpi_datatype_hindexed_create( int* block_lengths, MPI_Ai new_t->base.unserialize = &unserialize_hindexed; new_t->base.subtype_free = &free_hindexed; new_t->base.subtype_use = &use_hindexed; - //TODO : add a custom function for each time to clean these new_t->block_lengths= xbt_new(int, block_count); new_t->block_indices= xbt_new(MPI_Aint, block_count); int i; @@ -1085,7 +1083,6 @@ s_smpi_mpi_struct_t* smpi_datatype_struct_create( int* block_lengths, MPI_Aint* new_t->base.unserialize = &unserialize_struct; new_t->base.subtype_free = &free_struct; new_t->base.subtype_use = &use_struct; - //TODO : add a custom function for each time to clean these new_t->block_lengths= xbt_new(int, block_count); new_t->block_indices= xbt_new(MPI_Aint, block_count); new_t->old_types= xbt_new(MPI_Datatype, block_count); @@ -1096,10 +1093,7 @@ s_smpi_mpi_struct_t* smpi_datatype_struct_create( int* block_lengths, MPI_Aint* new_t->old_types[i]=old_types[i]; smpi_datatype_use(new_t->old_types[i]); } - //new_t->block_lengths = block_lengths; - //new_t->block_indices = block_indices; new_t->block_count = block_count; - //new_t->old_types = old_types; return new_t; }