X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/430c1a742ebab0aaa32b3b080c4440c5b9431742..7ac4abc35931448d0bbc5f3c1260320dfe4110c9:/src/smpi/smpi_datatype.hpp diff --git a/src/smpi/smpi_datatype.hpp b/src/smpi/smpi_datatype.hpp index 57983e16f8..220a424ca5 100644 --- a/src/smpi/smpi_datatype.hpp +++ b/src/smpi/smpi_datatype.hpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -7,9 +6,8 @@ #ifndef SMPI_DATATYPE_HPP #define SMPI_DATATYPE_HPP -#include - -#include "private.h" +#include "src/smpi/smpi_f2c.hpp" +#include "src/smpi/smpi_keyvals.hpp" #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 */ @@ -77,34 +75,38 @@ typedef struct { namespace simgrid{ namespace smpi{ -class Datatype{ -//TODO: remove - public: +class Datatype : public F2C, public Keyval{ + private: char* name_; size_t size_; MPI_Aint lb_; MPI_Aint ub_; int flags_; - xbt_dict_t attributes_; - int in_use_; + int refcount_; 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 std::unordered_map keyvals_; + static int keyval_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 commit(); - bool is_valid(); + + char* name(); size_t size(); - int flags(); - void addflag(int flag); MPI_Aint lb(); MPI_Aint ub(); + int flags(); + int refcount(); + + void ref(); + static void unref(MPI_Datatype datatype); + void commit(); + bool is_valid(); + void addflag(int flag); int extent(MPI_Aint * lb, MPI_Aint * extent); MPI_Aint get_extent(); - char* name(); void get_name(char* name, int* length); void set_name(char* name); static int copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, @@ -113,9 +115,6 @@ class Datatype{ int count); virtual void unserialize( void* contiguous, void *noncontiguous, int count, MPI_Op op); - int attr_delete(int keyval); - int attr_get(int keyval, void* attr_value, int* flag); - int attr_put(int keyval, void* attr_value); static int keyval_create(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state); static int keyval_free(int* keyval); int pack(void* inbuf, int incount, void* outbuf, int outcount, int* position, MPI_Comm comm); @@ -128,103 +127,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); -}; -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); + static Datatype* f2c(int id); }; -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); -}; - - } }