Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Some cleanups, some smells
[simgrid.git] / src / smpi / smpi_datatype.hpp
index 57983e1..1cec8fb 100644 (file)
@@ -10,6 +10,7 @@
 #include <xbt/base.h>
 
 #include "private.h"
+#include <unordered_map>
 
 #define DT_FLAG_DESTROYED     0x0001  /**< user destroyed but some other layers still have a reference */
 #define DT_FLAG_COMMITED      0x0002  /**< ready to be used for a send/recv operation */
 
 extern const MPI_Datatype MPI_PTR;
 
+typedef struct s_smpi_mpi_type_key_elem {
+  MPI_Type_copy_attr_function* copy_fn;
+  MPI_Type_delete_attr_function* delete_fn;
+} s_smpi_mpi_type_key_elem_t; 
+typedef struct s_smpi_mpi_type_key_elem *smpi_type_key_elem;
+
 //The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC.
 typedef struct {
   float value;
@@ -77,24 +84,28 @@ typedef struct {
 namespace simgrid{
 namespace smpi{
 
-class Datatype{
-//TODO: remove
-  public:
+class Datatype : public F2C{
+  protected:
     char* name_;
     size_t size_;
     MPI_Aint lb_;
     MPI_Aint ub_;
     int flags_;
     xbt_dict_t attributes_;
-    int in_use_;
+    int refcount_;
+
+    static std::unordered_map<int, smpi_type_key_elem> keyvals_;
+    static int keyval_id_;
 
   public:
-    Datatype(int size,int lb, int ub, int flags);
-    Datatype(char* name, int size,int lb, int ub, int flags);
-    Datatype(Datatype *datatype);
+    static MPI_Datatype null_id_;
+
+    Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags);
+    Datatype(char* name, int size,MPI_Aint lb, MPI_Aint ub, int flags);
+    Datatype(Datatype *datatype, int* ret);
     virtual ~Datatype();
-    void use();
-    void unuse();
+    void ref();
+    static void unref(MPI_Datatype datatype);
     void commit();
     bool is_valid();
     size_t size();
@@ -128,103 +139,10 @@ class Datatype{
     static int create_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_type, MPI_Datatype* new_type);
     static int create_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype old_type, MPI_Datatype* new_type);
     static int create_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, MPI_Datatype* new_type);
-};
-
-class Type_Contiguous: public Datatype{
-  private:
-    int block_count_;
-    MPI_Datatype old_type_;
-  public:
-    Type_Contiguous(int size, int lb, int ub, int flags, int block_count, MPI_Datatype old_type);
-    ~Type_Contiguous();
-    void use();
-    void serialize( void* noncontiguous, void *contiguous, 
-                            int count);
-    void unserialize( void* contiguous_vector, void *noncontiguous_vector, 
-                              int count, MPI_Op op);
-};
-
-class Type_Vector: public Datatype{
-  private:
-    int block_count_;
-    int block_length_;
-    int block_stride_;
-    MPI_Datatype old_type_;
-  public:
-    Type_Vector(int size,int lb, int ub, int flags, int count, int blocklen, int stride, MPI_Datatype old_type);
-    ~Type_Vector();
-    void use();
-    void serialize( void* noncontiguous, void *contiguous, 
-                            int count);
-    void unserialize( void* contiguous_vector, void *noncontiguous_vector, 
-                              int count, MPI_Op op);
-};
-
-class Type_Hvector: public Datatype{
-  private:
-    int block_count_;
-    int block_length_;
-    MPI_Aint block_stride_;
-    MPI_Datatype old_type_;
-  public:
-    Type_Hvector(int size,int lb, int ub, int flags, int block_count, int block_length, MPI_Aint block_stride, MPI_Datatype old_type);
-    ~Type_Hvector();
-    void use();
-    void serialize( void* noncontiguous, void *contiguous, 
-                            int count);
-    void unserialize( void* contiguous_vector, void *noncontiguous_vector, 
-                              int count, MPI_Op op);
-};
 
-class Type_Indexed: public Datatype{
-  private:
-    int block_count_;
-    int* block_lengths_;
-    int* block_indices_;
-    MPI_Datatype old_type_;
-  public:
-    Type_Indexed(int size,int lb, int ub, int flags, int block_count, int* block_lengths, int* block_indices, MPI_Datatype old_type);
-    ~Type_Indexed();
-    void use();
-    void serialize( void* noncontiguous, void *contiguous, 
-                            int count);
-    void unserialize( void* contiguous_vector, void *noncontiguous_vector, 
-                              int count, MPI_Op op);
+    static Datatype* f2c(int id);
 };
 
-class Type_Hindexed: public Datatype{
-  private:
-    int block_count_;
-    int* block_lengths_;
-    MPI_Aint* block_indices_;
-    MPI_Datatype old_type_;
-  public:
-    Type_Hindexed(int size,int lb, int ub, int flags, int block_count, int* block_lengths, MPI_Aint* block_indices, MPI_Datatype old_type);
-    ~Type_Hindexed();
-    void use();
-    void serialize( void* noncontiguous, void *contiguous, 
-                            int count);
-    void unserialize( void* contiguous_vector, void *noncontiguous_vector, 
-                              int count, MPI_Op op);
-};
-
-class Type_Struct: public Datatype{
-  private:
-    int block_count_;
-    int* block_lengths_;
-    MPI_Aint* block_indices_;
-    MPI_Datatype* old_types_;
-  public:
-    Type_Struct(int size,int lb, int ub, int flags, int block_count, int* block_lengths, MPI_Aint* block_indices, MPI_Datatype* old_types);
-    ~Type_Struct();
-    void use();
-    void serialize( void* noncontiguous, void *contiguous, 
-                            int count);
-    void unserialize( void* contiguous_vector, void *noncontiguous_vector, 
-                              int count, MPI_Op op);
-};
-
-
 }
 }