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<Datatype>();
+ 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;
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 ||
}
}
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<Datatype>();
- 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()