namespace simgrid{
namespace smpi{
-xbt_dict_t Comm::keyvals_ = nullptr;
-int Comm::keyval_id_ = 0;//avoid collisions
+std::unordered_map<int, smpi_key_elem> Comm::keyvals_;
+int Comm::keyval_id_=0;
Comm::Comm(MPI_Group group, MPI_Topology topo) : group_(group), topo_(topo)
{
non_uniform_map_ = nullptr;
leaders_map_ = nullptr;
is_blocked_=0;
- attributes_=nullptr;
}
void Comm::destroy(Comm* comm)
(*newcomm) = new Comm(cp, this->topo());
int ret = MPI_SUCCESS;
- if(attributes_ !=nullptr){
- (*newcomm)->attributes_ = xbt_dict_new_homogeneous(nullptr);
- xbt_dict_cursor_t cursor = nullptr;
- char* key;
+ if(!attributes_.empty()){
int flag;
- void* value_in;
void* value_out;
- xbt_dict_foreach (attributes_, cursor, key, value_in) {
- smpi_comm_key_elem elem =
- static_cast<smpi_comm_key_elem>(xbt_dict_get_or_null_ext(keyvals_, key, sizeof(int)));
- if (elem != nullptr && elem->copy_fn != MPI_NULL_COPY_FN) {
- ret = elem->copy_fn(this, atoi(key), nullptr, value_in, &value_out, &flag);
+ for(auto it = attributes_.begin(); it != attributes_.end(); it++){
+ smpi_key_elem elem = keyvals_.at((*it).first);
+ if (elem != nullptr && elem->copy_fn.comm_copy_fn != MPI_NULL_COPY_FN) {
+ ret = elem->copy_fn.comm_copy_fn(this, (*it).first, nullptr, (*it).second, &value_out, &flag);
if (ret != MPI_SUCCESS) {
Comm::destroy(*newcomm);
*newcomm = MPI_COMM_NULL;
- xbt_dict_cursor_free(&cursor);
return ret;
}
- if (flag)
- xbt_dict_set_ext((*newcomm)->attributes_, key, sizeof(int), value_out, nullptr);
+ if (flag){
+ elem->refcount++;
+ (*newcomm)->attributes_.insert({(*it).first, value_out});
+ }
}
}
}
refcount_++;
}
-void Comm::cleanup_attributes(){
- if(attributes_ !=nullptr){
- xbt_dict_cursor_t cursor = nullptr;
- char* key;
- void* value;
- int flag;
- xbt_dict_foreach (attributes_, cursor, key, value) {
- smpi_comm_key_elem elem = static_cast<smpi_comm_key_elem>(xbt_dict_get_or_null(keyvals_, key));
- if (elem != nullptr && elem->delete_fn != nullptr)
- elem->delete_fn(this, atoi(key), value, &flag);
- }
- xbt_dict_free(&attributes_);
- }
-}
-
void Comm::cleanup_smp(){
if (intra_comm_ != MPI_COMM_NULL)
Comm::unref(intra_comm_);
if(comm->refcount_==0){
comm->cleanup_smp();
- comm->cleanup_attributes();
+ comm->cleanup_attr<Comm>();
delete comm;
}
}
smpi_process_set_replaying(true);
}
-int Comm::attr_delete(int keyval){
- smpi_comm_key_elem elem =
- static_cast<smpi_comm_key_elem>(xbt_dict_get_or_null_ext(keyvals_, reinterpret_cast<const char*>(&keyval), sizeof(int)));
- 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<const char*>(&keyval), sizeof(int));
- return MPI_SUCCESS;
-}
-
-int Comm::attr_get(int keyval, void* attr_value, int* flag){
- smpi_comm_key_elem elem =
- static_cast<smpi_comm_key_elem>(xbt_dict_get_or_null_ext(keyvals_, reinterpret_cast<const char*>(&keyval), sizeof(int)));
- if(elem==nullptr)
- return MPI_ERR_ARG;
- if(attributes_==nullptr){
- *flag=0;
- return MPI_SUCCESS;
- }
- try {
- *static_cast<void**>(attr_value) =
- xbt_dict_get_ext(attributes_, reinterpret_cast<const char*>(&keyval), sizeof(int));
- *flag=1;
- }
- catch (xbt_ex& ex) {
- *flag=0;
- }
- return MPI_SUCCESS;
-}
-
-int Comm::attr_put(int keyval, void* attr_value){
- if(keyvals_==nullptr)
- keyvals_ = xbt_dict_new_homogeneous(nullptr);
- smpi_comm_key_elem elem =
- static_cast<smpi_comm_key_elem>(xbt_dict_get_or_null_ext(keyvals_, reinterpret_cast<const char*>(&keyval), sizeof(int)));
- 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<const char*>(&keyval), sizeof(int), attr_value, nullptr);
- return MPI_SUCCESS;
-}
-
MPI_Comm Comm::f2c(int id) {
if(id == -2) {
return MPI_COMM_SELF;
return F2C::f2c_id_-1;
}
-int Comm::keyval_create(MPI_Comm_copy_attr_function* copy_fn, MPI_Comm_delete_attr_function* delete_fn, int* keyval,
- void* extra_state){
- if(keyvals_==nullptr)
- keyvals_ = xbt_dict_new_homogeneous(nullptr);
-
- smpi_comm_key_elem value = static_cast<smpi_comm_key_elem>(xbt_new0(s_smpi_mpi_comm_key_elem_t,1));
-
- value->copy_fn=copy_fn;
- value->delete_fn=delete_fn;
-
- *keyval = keyval_id_;
- xbt_dict_set_ext(keyvals_, reinterpret_cast<const char*>(keyval), sizeof(int),static_cast<void*>(value), nullptr);
- keyval_id_++;
- return MPI_SUCCESS;
-}
-
-int Comm::keyval_free(int* keyval){
- smpi_comm_key_elem elem =
- static_cast<smpi_comm_key_elem>(xbt_dict_get_or_null_ext(keyvals_, reinterpret_cast<const char*>(keyval), sizeof(int)));
- if(elem==nullptr)
- return MPI_ERR_ARG;
- xbt_dict_remove_ext(keyvals_, reinterpret_cast<const char*>(keyval), sizeof(int));
- xbt_free(elem);
- return MPI_SUCCESS;
-}
-
-void Comm::keyval_cleanup(){
- if(Comm::keyvals_!=nullptr)
- xbt_dict_free(&Comm::keyvals_);
-}
-
}
}