X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5328ea4927b5a641a4237e44502fcb5c27e5ddbf..f50c785a8f726657dc3b4e32de522a7b3baca707:/src/smpi/smpi_datatype.cpp diff --git a/src/smpi/smpi_datatype.cpp b/src/smpi/smpi_datatype.cpp index 877b40eaf9..d024277f18 100644 --- a/src/smpi/smpi_datatype.cpp +++ b/src/smpi/smpi_datatype.cpp @@ -18,10 +18,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (datatype)"); -std::unordered_map smpi_type_keyvals; -int type_keyval_id=0;//avoid collisions - - #define CREATE_MPI_DATATYPE(name, type) \ static Datatype mpi_##name ( \ (char*) # name, \ @@ -107,9 +103,10 @@ CREATE_MPI_DATATYPE(MPI_PTR, void*); namespace simgrid{ namespace smpi{ -MPI_Datatype Datatype::null_id_=MPI_DATATYPE_NULL; +std::unordered_map Datatype::keyvals_; +int Datatype::keyval_id_=0; -Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr), size_(size), lb_(lb), ub_(ub), flags_(flags), attributes_(nullptr), refcount_(1){ +Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(1){ #if HAVE_MC if(MC_is_active()) MC_ignore(&(refcount_), sizeof(refcount_)); @@ -117,36 +114,34 @@ Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr } //for predefined types, so in_use = 0. -Datatype::Datatype(char* name, int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(name), size_(size), lb_(lb), ub_(ub), flags_(flags), attributes_(nullptr), refcount_(0){ +Datatype::Datatype(char* name, int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(name), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(0){ #if HAVE_MC if(MC_is_active()) MC_ignore(&(refcount_), sizeof(refcount_)); #endif } -Datatype::Datatype(Datatype *datatype, int* ret) : name_(nullptr), lb_(datatype->lb_), ub_(datatype->ub_), flags_(datatype->flags_), attributes_(nullptr), refcount_(1) +Datatype::Datatype(Datatype *datatype, int* ret) : name_(nullptr), lb_(datatype->lb_), ub_(datatype->ub_), flags_(datatype->flags_), refcount_(1) { flags_ &= ~DT_FLAG_PREDEFINED; *ret = MPI_SUCCESS; if(datatype->name_) name_ = xbt_strdup(datatype->name_); - if(datatype->attributes_ !=nullptr){ - attributes_ = xbt_dict_new_homogeneous(nullptr); - xbt_dict_cursor_t cursor = nullptr; - char* key; + if(!(datatype->attributes_.empty())){ int flag; - void* value_in; void* value_out; - xbt_dict_foreach (datatype->attributes_, cursor, key, value_in) { - smpi_type_key_elem elem = smpi_type_keyvals.at(atoi(key)); - if (elem != nullptr && elem->copy_fn != MPI_NULL_COPY_FN) { - *ret = elem->copy_fn(datatype, atoi(key), nullptr, value_in, &value_out, &flag); + for(auto it = datatype->attributes_.begin(); it != datatype->attributes_.end(); it++){ + smpi_key_elem elem = keyvals_.at((*it).first); + + if (elem != nullptr && elem->copy_fn.type_copy_fn != MPI_NULL_COPY_FN) { + *ret = elem->copy_fn.type_copy_fn(datatype, (*it).first, nullptr, (*it).second, &value_out, &flag); if (*ret != MPI_SUCCESS) { - xbt_dict_cursor_free(&cursor); break; } - if (flag) - xbt_dict_set_ext(attributes_, key, sizeof(int), value_out, nullptr); + if (flag){ + elem->refcount++; + attributes_.insert({(*it).first, value_out}); + } } } } @@ -164,18 +159,7 @@ Datatype::~Datatype(){ return; } - if(attributes_ !=nullptr){ - xbt_dict_cursor_t cursor = nullptr; - char* key; - void * value; - int flag; - xbt_dict_foreach(attributes_, cursor, key, value){ - smpi_type_key_elem elem = smpi_type_keyvals.at(atoi(key)); - if(elem!=nullptr && elem->delete_fn!=nullptr) - elem->delete_fn(this,*key, value, &flag); - } - xbt_dict_free(&attributes_); - } + cleanup_attr(); xbt_free(name_); } @@ -261,88 +245,6 @@ void Datatype::set_name(char* name){ name_ = xbt_strdup(name); } -int Datatype::attr_delete(int keyval){ - smpi_type_key_elem elem = smpi_type_keyvals.at(keyval); - if(elem==nullptr) - return MPI_ERR_ARG; - if(elem->delete_fn!=MPI_NULL_DELETE_FN){ - void * value = nullptr; - int flag; - if(this->attr_get(keyval, &value, &flag)==MPI_SUCCESS){ - int ret = elem->delete_fn(this, keyval, value, &flag); - if(ret!=MPI_SUCCESS) - return ret; - } - } - if(attributes_==nullptr) - return MPI_ERR_ARG; - - xbt_dict_remove_ext(attributes_, reinterpret_cast(&keyval), sizeof(int)); - return MPI_SUCCESS; -} - - -int Datatype::attr_get(int keyval, void* attr_value, int* flag){ - smpi_type_key_elem elem = smpi_type_keyvals.at(keyval); - if(elem==nullptr) - return MPI_ERR_ARG; - if(attributes_==nullptr){ - *flag=0; - return MPI_SUCCESS; - } - try { - *static_cast(attr_value) = xbt_dict_get_ext(attributes_, reinterpret_cast(&keyval), sizeof(int)); - *flag=1; - } - catch (xbt_ex& ex) { - *flag=0; - } - return MPI_SUCCESS; -} - -int Datatype::attr_put(int keyval, void* attr_value){ - smpi_type_key_elem elem = smpi_type_keyvals.at(keyval); - if(elem==nullptr) - return MPI_ERR_ARG; - int flag; - void* value = nullptr; - this->attr_get(keyval, &value, &flag); - if(flag!=0 && elem->delete_fn!=MPI_NULL_DELETE_FN){ - int ret = elem->delete_fn(this, keyval, value, &flag); - if(ret!=MPI_SUCCESS) - return ret; - } - if(attributes_==nullptr) - attributes_ = xbt_dict_new_homogeneous(nullptr); - - xbt_dict_set_ext(attributes_, reinterpret_cast(&keyval), sizeof(int), attr_value, nullptr); - return MPI_SUCCESS; -} - -int Datatype::keyval_create(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state){ - - smpi_type_key_elem value = (smpi_type_key_elem) xbt_new0(s_smpi_mpi_type_key_elem_t,1); - - value->copy_fn=copy_fn; - value->delete_fn=delete_fn; - - *keyval = type_keyval_id; - smpi_type_keyvals.insert({*keyval, value}); - type_keyval_id++; - return MPI_SUCCESS; -} - -int Datatype::keyval_free(int* keyval){ - smpi_type_key_elem elem = smpi_type_keyvals.at(*keyval); - if(elem==0){ - return MPI_ERR_ARG; - } - smpi_type_keyvals.erase(*keyval); - xbt_free(elem); - return MPI_SUCCESS; -} - - int Datatype::pack(void* inbuf, int incount, void* outbuf, int outcount, int* position,MPI_Comm comm){ if (outcount - *position < incount*static_cast(size_)) return MPI_ERR_BUFFER;