X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/558e19f535bb0c65b610bc758c8133ded549ca3c..371d168e21b83e2364c2ac2dbff3847588769c2b:/src/smpi/mpi/smpi_f2c.cpp diff --git a/src/smpi/mpi/smpi_f2c.cpp b/src/smpi/mpi/smpi_f2c.cpp index fc2a5c677b..a1e6be788b 100644 --- a/src/smpi/mpi/smpi_f2c.cpp +++ b/src/smpi/mpi/smpi_f2c.cpp @@ -1,91 +1,58 @@ -/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2023. 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 - -namespace simgrid{ -namespace smpi{ - -xbt_dict_t F2C::f2c_lookup_=nullptr; -int F2C::f2c_id_=0; - -xbt_dict_t F2C::f2c_lookup(){ - return f2c_lookup_; -} - -void F2C::set_f2c_lookup(xbt_dict_t dict){ - f2c_lookup_=dict; -} - -void F2C::f2c_id_increment(){ - f2c_id_++; -}; - -int F2C::f2c_id(){ - return f2c_id_; -}; - -char* F2C::get_key(char* key, int id) { - std::snprintf(key, KEY_SIZE, "%x", (unsigned)id); - return key; -} - -char* F2C::get_key_id(char* key, int id) { - std::snprintf(key, KEY_SIZE, "%x_%d", (unsigned)id, smpi_process()->index()); - return key; -} - -void F2C::delete_lookup(){ - xbt_dict_free(&f2c_lookup_); -} - -xbt_dict_t F2C::lookup(){ - return f2c_lookup_; -} - -void F2C::free_f(int id){ - char key[KEY_SIZE]; - xbt_dict_remove(f2c_lookup_, get_key(key, id)); -} - -int F2C::add_f(){ - if(f2c_lookup_==nullptr){ - f2c_lookup_=xbt_dict_new_homogeneous(nullptr); - } - char key[KEY_SIZE]; - xbt_dict_set(f2c_lookup_, get_key(key, f2c_id_), this, nullptr); +#include "private.hpp" +#include "src/smpi/include/smpi_actor.hpp" +#include "src/instr/instr_smpi.hpp" + +const int mpi_in_place_ = -222; +const int mpi_bottom_ = -111; +const int mpi_status_ignore_ = 0; +const int mpi_statuses_ignore_ = 0; + +namespace simgrid::smpi { + +std::unique_ptr F2C::f2c_lookup_ = nullptr; +int F2C::f2c_id_ = 0; +F2C::f2c_lookup_type::size_type F2C::num_default_handles_ = 0; + +// Keep it non trivially-constructible, or it will break MC+smpi on FreeBSD with Clang (don't ask why) +F2C::F2C() = default; + +int F2C::add_f() +{ + allocate_lookup(); + if (auto const* loc = smpi_process()->call_location(); loc && loc->linenumber != 0) + call_location_= std::string (loc->filename + ":" + std::to_string(loc->linenumber)); + my_f2c_id_ = global_f2c_id(); + (*f2c_lookup_)[my_f2c_id_] = this; f2c_id_increment(); - return f2c_id_-1; + return my_f2c_id_; } -int F2C::c2f(){ - if(f2c_lookup_==nullptr){ - f2c_lookup_=xbt_dict_new_homogeneous(nullptr); - } +int F2C::c2f() +{ + allocate_lookup(); - char* existing_key = xbt_dict_get_key(f2c_lookup_, this); - if(existing_key!=nullptr){ - return atoi(existing_key);} - else{ - return this->add_f();} + if(my_f2c_id_==-1) + /* this function wasn't found, add it */ + return this->add_f(); + else + return my_f2c_id_; } -F2C* F2C::f2c(int id){ - if(f2c_lookup_==nullptr){ - f2c_lookup_=xbt_dict_new_homogeneous(nullptr); - } +F2C* F2C::f2c(int id) +{ + allocate_lookup(); + 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(id); + return comm == f2c_lookup_->end() ? nullptr : comm->second; }else - return NULL; + return nullptr; } -} -} +} // namespace simgrid::smpi