X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fa15ed6668695b02e85ec71de10240199df84cc4..fc7eb6b5be3c54839e8d8b2132afc433e6c7d378:/src/s4u/s4u_Engine.cpp diff --git a/src/s4u/s4u_Engine.cpp b/src/s4u/s4u_Engine.cpp index a97f2203e8..d28233b3eb 100644 --- a/src/s4u/s4u_Engine.cpp +++ b/src/s4u/s4u_Engine.cpp @@ -16,19 +16,21 @@ #include "simgrid/simix.h" #include "src/instr/instr_private.hpp" #include "src/kernel/EngineImpl.hpp" +#include "src/kernel/activity/CommImpl.hpp" +#include "src/kernel/actor/ActorImpl.hpp" #include "src/mc/mc_replay.hpp" #include "src/surf/network_interface.hpp" #include "surf/surf.hpp" // routing_platf. FIXME:KILLME. SOON -#include #include #include -#include #include XBT_LOG_NEW_CATEGORY(s4u, "Log channels of the S4U (Simgrid for you) interface"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_engine, s4u, "Logging specific to S4U (engine)"); +static simgrid::kernel::actor::ActorCode maestro_code; + namespace simgrid { namespace s4u { xbt::signal Engine::on_platform_creation; @@ -37,14 +39,17 @@ xbt::signal Engine::on_simulation_end; xbt::signal Engine::on_time_advance; xbt::signal Engine::on_deadlock; -Engine* Engine::instance_ = nullptr; /* That singleton is awful, but I don't see no other solution right now. */ +Engine* Engine::instance_ = nullptr; /* This singleton is awful, but I don't see no other solution right now. */ void Engine::initialize(int* argc, char** argv) { xbt_assert(Engine::instance_ == nullptr, "It is currently forbidden to create more than one instance of s4u::Engine"); Engine::instance_ = this; instr::init(); - SIMIX_global_init(argc, argv); + pimpl->initialize(argc, argv); + // Either create a new context with maestro or create + // a context object with the current context maestro): + kernel::actor::create_maestro(maestro_code); } Engine::Engine(std::string name) : pimpl(new kernel::EngineImpl()) @@ -61,15 +66,19 @@ Engine::Engine(int* argc, char** argv) : pimpl(new kernel::EngineImpl()) Engine::~Engine() { - delete pimpl; + pimpl->shutdown(); Engine::instance_ = nullptr; } /** @brief Retrieve the engine singleton */ Engine* Engine::get_instance() +{ + return get_instance(nullptr, nullptr); +} +Engine* Engine::get_instance(int* argc, char** argv) { if (Engine::instance_ == nullptr) { - auto e = new Engine(nullptr, nullptr); + auto e = new Engine(argc, argv); xbt_assert(Engine::instance_ == e); } return Engine::instance_; @@ -78,13 +87,12 @@ Engine* Engine::get_instance() void Engine::shutdown() { delete Engine::instance_; - Engine::instance_ = nullptr; } double Engine::get_clock() { if (MC_is_active() || MC_record_replay_is_active()) { - return MC_process_clock_get(SIMIX_process_self()); + return MC_process_clock_get(kernel::actor::ActorImpl::self()); } else { return surf_get_clock(); } @@ -93,7 +101,7 @@ double Engine::get_clock() void Engine::add_model(std::shared_ptr model, const std::vector& dependencies) { - simgrid::kernel::actor::simcall([this, &model, &dependencies] { pimpl->add_model(std::move(model), dependencies); }); + kernel::actor::simcall([this, &model, &dependencies] { pimpl->add_model(std::move(model), dependencies); }); } const std::vector& Engine::get_all_models() const @@ -110,33 +118,17 @@ const std::vector& Engine::get_all_models() c */ void Engine::load_platform(const std::string& platf) const { - double start = xbt_os_time(); - if (boost::algorithm::ends_with(platf, ".so")) { - void* handle = dlopen(platf.c_str(), RTLD_LAZY); - xbt_assert(handle, "Impossible to open platform file: %s", platf.c_str()); - typedef void (*load_fct_t)(const Engine&); - dlerror(); - load_fct_t callable = (load_fct_t)dlsym(handle, "load_platform"); - const char* dlsym_error = dlerror(); - xbt_assert(not dlsym_error, "Error: %s", dlsym_error); - callable(*this); - dlclose(handle); - } else { - parse_platform_file(platf); - } - - double end = xbt_os_time(); - XBT_DEBUG("PARSE TIME: %g", (end - start)); + pimpl->load_platform(platf); } -void Engine::register_function(const std::string& name, int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v329 +void Engine::register_function(const std::string& name, int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v330 { kernel::actor::ActorCodeFactory code_factory = [code](std::vector args) { return xbt::wrap_main(code, std::move(args)); }; register_function(name, code_factory); } -void Engine::register_default(int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v329 +void Engine::register_default(int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v330 { register_default([code](std::vector args) { return xbt::wrap_main(code, std::move(args)); }); } @@ -254,6 +246,14 @@ Link* Engine::link_by_name(const std::string& name) const return link->second->get_iface(); } +SplitDuplexLink* Engine::split_duplex_link_by_name(const std::string& name) const +{ + auto link = pimpl->split_duplex_links_.find(name); + if (link == pimpl->split_duplex_links_.end()) + throw std::invalid_argument(std::string("Link not found: ") + name); + return link->second->get_iface(); +} + /** @brief Find a link from its name (or nullptr if that link does not exist) */ Link* Engine::link_by_name_or_null(const std::string& name) const { @@ -453,13 +453,18 @@ void Engine::set_config(const std::string& name, const std::string& value) config::set_value(name.c_str(), value); } +Engine* Engine::set_default_comm_data_copy_callback(void (*callback)(kernel::activity::CommImpl*, void*, size_t)) +{ + kernel::activity::CommImpl::set_copy_data_callback(callback); + return this; +} } // namespace s4u } // namespace simgrid /* **************************** Public C interface *************************** */ void simgrid_init(int* argc, char** argv) { - simgrid::s4u::Engine e(argc, argv); + static simgrid::s4u::Engine e(argc, argv); } void simgrid_load_platform(const char* file) { @@ -491,3 +496,16 @@ int simgrid_get_actor_count() // XBT_ATTRIB_DEPRECATED_v330 { return simgrid::s4u::Engine::get_instance()->get_actor_count(); } + +void simgrid_set_maestro(void (*code)(void*), void* data) +{ +#ifdef _WIN32 + XBT_INFO("WARNING, SIMIX_set_maestro is believed to not work on windows. Please help us investigating this issue if " + "you need that feature"); +#endif + maestro_code = std::bind(code, data); +} +void SIMIX_set_maestro(void (*code)(void*), void* data) // XBT_ATTRIB_DEPRECATED_v333 +{ + simgrid_set_maestro(code, data); +}