Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix issues with attr and cloning
[simgrid.git] / src / smpi / mpi / smpi_datatype.cpp
index df3e3d0..5422b5d 100644 (file)
@@ -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<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;
@@ -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<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()