X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e4abd3f271729beeff499da36267bfb274dd1f6d..1ee0ed6b44e3639fcfcbb37a43e8709aa95a2db5:/src/smpi/smpi_mpi_dt.c diff --git a/src/smpi/smpi_mpi_dt.c b/src/smpi/smpi_mpi_dt.c index 17e7614d6b..19f02289f3 100644 --- a/src/smpi/smpi_mpi_dt.c +++ b/src/smpi/smpi_mpi_dt.c @@ -181,7 +181,7 @@ int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, s_smpi_mpi_vector_t* type_c = (s_smpi_mpi_vector_t*)sendtype; - void * buf_tmp = malloc(count * type_c->size_oldtype); + void * buf_tmp = xbt_malloc(count * type_c->size_oldtype); subtype->serialize( sendbuf, buf_tmp,1, subtype); subtype = recvtype->substruct; @@ -295,14 +295,35 @@ void smpi_datatype_create(MPI_Datatype* new_type, int size,int lb, int ub, int h new_t->ub = ub; new_t->flags = flags; new_t->substruct = struct_type; + new_t->in_use=0; *new_type = new_t; } 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)->has_subtype == 1){ ((s_smpi_subtype_t *)(*type)->substruct)->subtype_free(type); } xbt_free(*type); + +} + +void smpi_datatype_use(MPI_Datatype type){ + if(type)type->in_use++; +} + + +void smpi_datatype_unuse(MPI_Datatype type){ + if(type && type->in_use-- == 0 && (type->flags & DT_FLAG_DESTROYED)) + smpi_datatype_free(&type); } int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_type)