X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/67fe7b9d6c00b390a8598bc1e72d42d8343cb218..dd96d5146134f3ff468a7835db49556c8e6225a5:/src/smpi/mpi/smpi_datatype.cpp diff --git a/src/smpi/mpi/smpi_datatype.cpp b/src/smpi/mpi/smpi_datatype.cpp index 5136911deb..c9b75ab4ac 100644 --- a/src/smpi/mpi/smpi_datatype.cpp +++ b/src/smpi/mpi/smpi_datatype.cpp @@ -128,21 +128,31 @@ Datatype::Datatype(Datatype *datatype, int* ret) : name_(nullptr), lb_(datatype- *ret = MPI_SUCCESS; if(datatype->name_) name_ = xbt_strdup(datatype->name_); - + if (not datatype->attributes()->empty()) { - int flag; + int flag=0; void* value_out; - for(auto it = datatype->attributes()->begin(); it != datatype->attributes()->end(); it++){ - smpi_key_elem elem = keyvals_.at((*it).first); - - if (elem != nullptr && elem->copy_fn.type_copy_fn != MPI_NULL_COPY_FN) { - *ret = elem->copy_fn.type_copy_fn(datatype, (*it).first, nullptr, (*it).second, &value_out, &flag); + for (auto const& it : *(datatype->attributes())) { + smpi_key_elem elem = keyvals_.at(it.first); + 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); + 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); + } if (*ret != MPI_SUCCESS) { break; } - if (flag){ + if(elem->copy_fn.type_copy_fn == MPI_TYPE_DUP_FN || + ((elem->copy_fn.type_copy_fn_fort != MPI_NULL_COPY_FN) && (*(int*)*elem->copy_fn.type_copy_fn_fort == 1))){ + elem->refcount++; + attributes()->insert({it.first, it.second}); + } else if (flag){ elem->refcount++; - attributes()->insert({(*it).first, value_out}); + attributes()->insert({it.first, value_out}); } } }