X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4d140762b2b9c8746cdd3b0680a7167867ba0ad9..d389c534faa9e89b5a9752fc122b20516b7659b0:/src/smpi/mpi/smpi_f2c.cpp diff --git a/src/smpi/mpi/smpi_f2c.cpp b/src/smpi/mpi/smpi_f2c.cpp index e5a5706bcc..868644c414 100644 --- a/src/smpi/mpi/smpi_f2c.cpp +++ b/src/smpi/mpi/smpi_f2c.cpp @@ -1,26 +1,33 @@ -/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2019. 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. */ -#include "private.h" #include "smpi_f2c.hpp" -#include "smpi_process.hpp" +#include "private.hpp" +#include "src/smpi/include/smpi_actor.hpp" #include +int mpi_in_place_; +int mpi_bottom_; +int mpi_status_ignore_; +int mpi_statuses_ignore_; + namespace simgrid{ namespace smpi{ -xbt_dict_t F2C::f2c_lookup_=nullptr; -int F2C::f2c_id_=0; +std::unordered_map* F2C::f2c_lookup_ = nullptr; +int F2C::f2c_id_ = 0; -xbt_dict_t F2C::f2c_lookup(){ +std::unordered_map* F2C::f2c_lookup() +{ return f2c_lookup_; } -void F2C::set_f2c_lookup(xbt_dict_t dict){ - f2c_lookup_=dict; +void F2C::set_f2c_lookup(std::unordered_map* map) +{ + f2c_lookup_ = map; } void F2C::f2c_id_increment(){ @@ -32,59 +39,66 @@ int F2C::f2c_id(){ }; char* F2C::get_key(char* key, int id) { - std::snprintf(key, KEY_SIZE, "%x",id); + std::snprintf(key, KEY_SIZE, "%u", static_cast(id)); return key; } char* F2C::get_key_id(char* key, int id) { - std::snprintf(key, KEY_SIZE, "%x_%d",id, smpi_process()->index()); + std::snprintf(key, KEY_SIZE, "%u_%ld", static_cast(id), simgrid::s4u::this_actor::get_pid()); return key; } void F2C::delete_lookup(){ - xbt_dict_free(&f2c_lookup_); + delete f2c_lookup_; } -xbt_dict_t F2C::lookup(){ +std::unordered_map* F2C::lookup() +{ return f2c_lookup_; } -void F2C::free_f(int id){ +void F2C::free_f(int id) +{ char key[KEY_SIZE]; - xbt_dict_remove(f2c_lookup_, get_key(key, id)); + f2c_lookup_->erase(get_key(key, id)); } -int F2C::add_f(){ - if(f2c_lookup_==nullptr){ - f2c_lookup_=xbt_dict_new_homogeneous(nullptr); - } +int F2C::add_f() +{ + if (f2c_lookup_ == nullptr) + f2c_lookup_ = new std::unordered_map; + char key[KEY_SIZE]; - xbt_dict_set(f2c_lookup_, get_key(key, f2c_id_), this, nullptr); + (*f2c_lookup_)[get_key(key, f2c_id_)] = this; f2c_id_increment(); return f2c_id_-1; } -int F2C::c2f(){ - if(f2c_lookup_==nullptr){ - f2c_lookup_=xbt_dict_new_homogeneous(nullptr); +int F2C::c2f() +{ + if (f2c_lookup_ == nullptr) { + f2c_lookup_ = new std::unordered_map; } - char* existing_key = xbt_dict_get_key(f2c_lookup_, this); - if(existing_key!=nullptr){ - return atoi(existing_key);} - else{ - return this->add_f();} + for (auto const& elm : *f2c_lookup_) + if (elm.second == this) + return std::stoi(elm.first); + + /* this function wasn't found, add it */ + return this->add_f(); } -F2C* F2C::f2c(int id){ - if(f2c_lookup_==nullptr){ - f2c_lookup_=xbt_dict_new_homogeneous(nullptr); - } +F2C* F2C::f2c(int id) +{ + if (f2c_lookup_ == nullptr) + f2c_lookup_ = new std::unordered_map; + if(id >= 0){ char key[KEY_SIZE]; - return static_cast(xbt_dict_get_or_null(f2c_lookup_, get_key(key, id))); + auto comm = f2c_lookup_->find(get_key(key, id)); + return comm == f2c_lookup_->end() ? nullptr : comm->second; }else - return NULL; + return nullptr; } }