X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8aa45aa966b01c54b5cc2a2a3826e44c55bde174..709364a65f29534ba568135b1f7714427e274bc2:/src/smpi/mpi/smpi_datatype.cpp diff --git a/src/smpi/mpi/smpi_datatype.cpp b/src/smpi/mpi/smpi_datatype.cpp index df3e3d0b07..5422b5dfe9 100644 --- a/src/smpi/mpi/smpi_datatype.cpp +++ b/src/smpi/mpi/smpi_datatype.cpp @@ -130,8 +130,30 @@ Datatype::Datatype(char* name, int ident, int size, MPI_Aint lb, MPI_Aint ub, in Datatype::Datatype(Datatype* datatype, int* ret) : size_(datatype->size_), lb_(datatype->lb_), ub_(datatype->ub_), flags_(datatype->flags_) { + *ret = this->copy_attrs(datatype); +} + +Datatype::~Datatype() +{ + xbt_assert(refcount_ >= 0); + + if(flags_ & DT_FLAG_PREDEFINED) + return; + + //if still used, mark for deletion + if(refcount_!=0){ + flags_ |=DT_FLAG_DESTROYED; + return; + } + + cleanup_attr(); + delete contents_; + xbt_free(name_); +} + +int Datatype::copy_attrs(Datatype* datatype){ flags_ &= ~DT_FLAG_PREDEFINED; - *ret = MPI_SUCCESS; + int ret = MPI_SUCCESS; if (not datatype->attributes()->empty()) { int flag=0; @@ -141,13 +163,13 @@ Datatype::Datatype(Datatype* datatype, int* ret) if (elem != nullptr){ if( elem->copy_fn.type_copy_fn != MPI_NULL_COPY_FN && elem->copy_fn.type_copy_fn != MPI_TYPE_DUP_FN) - *ret = elem->copy_fn.type_copy_fn(datatype, it.first, elem->extra_state, it.second, &value_out, &flag); + ret = elem->copy_fn.type_copy_fn(datatype, it.first, elem->extra_state, it.second, &value_out, &flag); else if ( elem->copy_fn.type_copy_fn_fort != MPI_NULL_COPY_FN && (*(int*)*elem->copy_fn.type_copy_fn_fort) != 1){ value_out=(int*)xbt_malloc(sizeof(int)); - elem->copy_fn.type_copy_fn_fort(datatype, it.first, elem->extra_state, it.second, value_out, &flag,ret); + elem->copy_fn.type_copy_fn_fort(datatype, it.first, elem->extra_state, it.second, value_out, &flag, &ret); } - if (*ret != MPI_SUCCESS) { + if (ret != MPI_SUCCESS) { break; } if(elem->copy_fn.type_copy_fn == MPI_TYPE_DUP_FN || @@ -162,29 +184,13 @@ Datatype::Datatype(Datatype* datatype, int* ret) } } contents_ = new Datatype_contents(MPI_COMBINER_DUP, 0, nullptr, 0, nullptr, 1, &datatype); + return ret; } -Datatype::~Datatype() -{ - xbt_assert(refcount_ >= 0); - - if(flags_ & DT_FLAG_PREDEFINED) - return; - - //if still used, mark for deletion - if(refcount_!=0){ - flags_ |=DT_FLAG_DESTROYED; - return; - } - - cleanup_attr(); - delete contents_; - xbt_free(name_); -} - -MPI_Datatype Datatype::clone(){ - int ret = MPI_SUCCESS; - return new Datatype(this, &ret); +int Datatype::clone(MPI_Datatype* type){ + int ret; + *type = new Datatype(this, &ret); + return ret; } void Datatype::ref()