Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make Datatype::contents_ a private std::unique_ptr.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Fri, 19 Mar 2021 13:14:47 +0000 (14:14 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Fri, 19 Mar 2021 15:12:50 +0000 (16:12 +0100)
src/smpi/include/smpi_datatype.hpp
src/smpi/mpi/smpi_datatype.cpp
src/smpi/mpi/smpi_datatype_derived.cpp

index 67ac906..3874680 100644 (file)
@@ -100,11 +100,17 @@ class Datatype : public F2C, public Keyval{
   MPI_Aint ub_;
   int flags_;
   int refcount_ = 1;
+  std::unique_ptr<Datatype_contents> contents_ = nullptr;
+
+protected:
+  template <typename... Args> void set_contents(Args&&... args)
+  {
+    contents_ = std::make_unique<Datatype_contents>(std::forward<Args>(args)...);
+  }
 
 public:
   static std::unordered_map<int, smpi_key_elem> keyvals_;
   static int keyval_id_;
-  Datatype_contents* contents_ = nullptr;
 
   Datatype(int ident, int size, MPI_Aint lb, MPI_Aint ub, int flags);
   Datatype(const char* name, int ident, int size, MPI_Aint lb, MPI_Aint ub, int flags);
index d0a9b89..fbadce3 100644 (file)
@@ -152,7 +152,6 @@ Datatype::~Datatype()
       return;
   }
   cleanup_attr<Datatype>();
-  delete contents_;
 }
 
 int Datatype::copy_attrs(Datatype* datatype){
@@ -187,8 +186,7 @@ int Datatype::copy_attrs(Datatype* datatype){
       }
     }
   }
-  delete contents_;
-  contents_ = new Datatype_contents(MPI_COMBINER_DUP, 0, nullptr, 0, nullptr, 1, &datatype);
+  set_contents(MPI_COMBINER_DUP, 0, nullptr, 0, nullptr, 1, &datatype);
   return ret;
 }
 
@@ -424,7 +422,7 @@ int Datatype::create_vector(int count, int block_length, int stride, MPI_Datatyp
     *new_type = new Datatype(count * block_length * old_type->size(), 0, ((count -1) * stride + block_length)*
                          old_type->size(), DT_FLAG_CONTIGUOUS);
     const std::array<int, 3> ints = {{count, block_length, stride}};
-    (*new_type)->contents_ = new Datatype_contents(MPI_COMBINER_VECTOR, 3, ints.data(), 0, nullptr, 1, &old_type);
+    (*new_type)->set_contents(MPI_COMBINER_VECTOR, 3, ints.data(), 0, nullptr, 1, &old_type);
     retval=MPI_SUCCESS;
   }
   return retval;
@@ -450,7 +448,7 @@ int Datatype::create_hvector(int count, int block_length, MPI_Aint stride, MPI_D
     /* in this situation the data are contiguous thus it's not required to serialize and unserialize it*/
     *new_type = new Datatype(count * block_length * old_type->size(), 0, count * block_length * old_type->size(), DT_FLAG_CONTIGUOUS);
     const std::array<int, 2> ints = {{count, block_length}};
-    (*new_type)->contents_ = new Datatype_contents(MPI_COMBINER_HVECTOR, 2, ints.data(), 1, &stride, 1, &old_type);
+    (*new_type)->set_contents(MPI_COMBINER_HVECTOR, 2, ints.data(), 1, &stride, 1, &old_type);
     retval=MPI_SUCCESS;
   }
   return retval;
index 36d8973..b9c9cf7 100644 (file)
@@ -26,7 +26,7 @@ Datatype_contents::Datatype_contents(int combiner, int number_of_integers, const
 Type_Contiguous::Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type)
     : Datatype(size, lb, ub, flags), block_count_(block_count), old_type_(old_type)
 {
-  contents_ = new Datatype_contents(MPI_COMBINER_CONTIGUOUS, 1, &block_count, 0, nullptr, 1, &old_type);
+  set_contents(MPI_COMBINER_CONTIGUOUS, 1, &block_count, 0, nullptr, 1, &old_type);
   old_type_->ref();
 }
 
@@ -60,7 +60,7 @@ void Type_Contiguous::unserialize(const void* contiguous_buf, void* noncontiguou
 
 Type_Hvector::Type_Hvector(int size,MPI_Aint lb, MPI_Aint ub, int flags, int count, int block_length, MPI_Aint stride, MPI_Datatype old_type): Datatype(size, lb, ub, flags), block_count_(count), block_length_(block_length), block_stride_(stride), old_type_(old_type){
   const std::array<int, 2> ints = {{count, block_length}};
-  contents_                     = new Datatype_contents(MPI_COMBINER_HVECTOR, 2, ints.data(), 1, &stride, 1, &old_type);
+  set_contents(MPI_COMBINER_HVECTOR, 2, ints.data(), 1, &stride, 1, &old_type);
   old_type->ref();
 }
 Type_Hvector::~Type_Hvector(){
@@ -116,9 +116,8 @@ Type_Vector::Type_Vector(int size, MPI_Aint lb, MPI_Aint ub, int flags, int coun
                          MPI_Datatype old_type)
     : Type_Hvector(size, lb, ub, flags, count, block_length, stride * old_type->get_extent(), old_type)
 {
-  delete contents_;
   const std::array<int, 3> ints = {{count, block_length, stride}};
-  contents_                     = new Datatype_contents(MPI_COMBINER_VECTOR, 3, ints.data(), 0, nullptr, 1, &old_type);
+  set_contents(MPI_COMBINER_VECTOR, 3, ints.data(), 0, nullptr, 1, &old_type);
 }
 
 int Type_Vector::clone(MPI_Datatype* type)
@@ -140,7 +139,7 @@ Type_Hindexed::Type_Hindexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int
   ints[0]=count;
   for(int i=1;i<=count;i++)
     ints[i]=block_lengths[i-1];
-  contents_ = new Datatype_contents(MPI_COMBINER_HINDEXED, count + 1, ints.data(), count, block_indices, 1, &old_type);
+  set_contents(MPI_COMBINER_HINDEXED, count + 1, ints.data(), count, block_indices, 1, &old_type);
   old_type_->ref();
   for (int i = 0; i < count; i++) {
     block_lengths_[i] = block_lengths[i];
@@ -228,14 +227,13 @@ Type_Indexed::Type_Indexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int co
                            const int* block_indices, MPI_Datatype old_type)
     : Type_Hindexed(size, lb, ub, flags, count, block_lengths, block_indices, old_type, old_type->get_extent())
 {
-  delete contents_;
   std::vector<int> ints(2 * count + 1);
   ints[0]=count;
   for(int i=1;i<=count;i++)
     ints[i]=block_lengths[i-1];
   for(int i=count+1;i<=2*count;i++)
     ints[i]=block_indices[i-count-1];
-  contents_ = new Datatype_contents(MPI_COMBINER_INDEXED, 2 * count + 1, ints.data(), 0, nullptr, 1, &old_type);
+  set_contents(MPI_COMBINER_INDEXED, 2 * count + 1, ints.data(), 0, nullptr, 1, &old_type);
 }
 
 int Type_Indexed::clone(MPI_Datatype* type)
@@ -257,8 +255,7 @@ Type_Struct::Type_Struct(int size, MPI_Aint lb, MPI_Aint ub, int flags, int coun
   ints[0]=count;
   for(int i=1;i<=count;i++)
     ints[i]=block_lengths[i-1];
-  contents_ =
-      new Datatype_contents(MPI_COMBINER_INDEXED, count + 1, ints.data(), count, block_indices, count, old_types);
+  set_contents(MPI_COMBINER_INDEXED, count + 1, ints.data(), count, block_indices, count, old_types);
   for (int i = 0; i < count; i++) {
     block_lengths_[i]=block_lengths[i];
     block_indices_[i]=block_indices[i];