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