From: SUTER Frederic Date: Tue, 25 May 2021 12:03:10 +0000 (+0200) Subject: Continue to migrate contents of simix_global to EngineImpl X-Git-Tag: v3.28~247 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/03b24505f40da4306ebf6f2b56c42941ae1d97e4 Continue to migrate contents of simix_global to EngineImpl thx @agiersch for unblocking this commit with the usual magic! --- diff --git a/src/kernel/EngineImpl.cpp b/src/kernel/EngineImpl.cpp index f2ce40346a..3cb115591a 100644 --- a/src/kernel/EngineImpl.cpp +++ b/src/kernel/EngineImpl.cpp @@ -41,8 +41,12 @@ EngineImpl::~EngineImpl() for (auto const& kv : links_) if (kv.second) kv.second->destroy(); - actors_to_run_.clear(); - actors_that_ran_.clear(); + + /* Free the remaining data structures */ +#if SIMGRID_HAVE_MC + xbt_dynar_free(&actors_vector_); + xbt_dynar_free(&dead_actors_vector_); +#endif } void EngineImpl::load_deployment(const std::string& file) const @@ -113,6 +117,18 @@ void EngineImpl::run_all_actors() actors_to_run_.clear(); } +actor::ActorImpl* EngineImpl::get_actor_by_pid(aid_t pid) +{ + auto item = actor_list_.find(pid); + if (item != actor_list_.end()) + return item->second; + + // Search the trash + for (auto& a : actors_to_destroy_) + if (a.get_pid() == pid) + return &a; + return nullptr; // Not found, even in the trash +} /** Execute all the tasks that are queued, e.g. `.then()` callbacks of futures. */ bool EngineImpl::execute_tasks() { @@ -135,7 +151,7 @@ bool EngineImpl::execute_tasks() return true; } -void EngineImpl::rm_daemon(actor::ActorImpl* actor) +void EngineImpl::remove_daemon(actor::ActorImpl* actor) { auto it = daemons_.find(actor); xbt_assert(it != daemons_.end(), "The dying daemon is not a daemon after all. Please report that bug."); @@ -157,6 +173,55 @@ void EngineImpl::add_actor_to_run_list(actor::ActorImpl* actor) actors_to_run_.push_back(actor); } } +void EngineImpl::empty_trash() +{ + while (not actors_to_destroy_.empty()) { + actor::ActorImpl* actor = &actors_to_destroy_.front(); + actors_to_destroy_.pop_front(); + XBT_DEBUG("Getting rid of %s (refcount: %d)", actor->get_cname(), actor->get_refcount()); + intrusive_ptr_release(actor); + } +#if SIMGRID_HAVE_MC + xbt_dynar_reset(dead_actors_vector_); +#endif +} + +void EngineImpl::display_all_actor_status() const +{ + XBT_INFO("%zu actors are still running, waiting for something.", actor_list_.size()); + /* List the actors and their state */ + XBT_INFO("Legend of the following listing: \"Actor (@): \""); + for (auto const& kv : actor_list_) { + actor::ActorImpl* actor = kv.second; + + if (actor->waiting_synchro_) { + const char* synchro_description = "unknown"; + + if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) + synchro_description = "execution"; + + if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) + synchro_description = "communication"; + + if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) + synchro_description = "sleeping"; + + if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) + synchro_description = "synchronization"; + + if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) + synchro_description = "I/O"; + + XBT_INFO("Actor %ld (%s@%s): waiting for %s activity %#zx (%s) in state %d to finish", actor->get_pid(), + actor->get_cname(), actor->get_host()->get_cname(), synchro_description, + (xbt_log_no_loc ? (size_t)0xDEADBEEF : (size_t)actor->waiting_synchro_.get()), + actor->waiting_synchro_->get_cname(), (int)actor->waiting_synchro_->state_); + } else { + XBT_INFO("Actor %ld (%s@%s) simcall %s", actor->get_pid(), actor->get_cname(), actor->get_host()->get_cname(), + SIMIX_simcall_name(actor->simcall_)); + } + } +} void EngineImpl::run() { @@ -262,7 +327,7 @@ void EngineImpl::run() } while (execute_tasks()); /* If only daemon actors remain, cancel their actions, mark them to die and reschedule them */ - if (simix_global->process_list.size() == daemons_.size()) + if (actor_list_.size() == daemons_.size()) for (auto const& dmon : daemons_) { XBT_DEBUG("Kill %s", dmon->get_cname()); simix_global->maestro_->kill(dmon); @@ -270,7 +335,7 @@ void EngineImpl::run() } time = timer::Timer::next(); - if (time > -1.0 || not simix_global->process_list.empty()) { + if (time > -1.0 || not actor_list_.empty()) { XBT_DEBUG("Calling surf_solve"); time = surf_solve(time); XBT_DEBUG("Moving time ahead : %g", time); @@ -290,27 +355,27 @@ void EngineImpl::run() } while (again); /* Clean actors to destroy */ - simix_global->empty_trash(); + empty_trash(); - XBT_DEBUG("### time %f, #actors %zu, #to_run %zu", time, simix_global->process_list.size(), actors_to_run_.size()); + XBT_DEBUG("### time %f, #actors %zu, #to_run %zu", time, actor_list_.size(), actors_to_run_.size()); - if (time < 0. && actors_to_run_.empty() && not simix_global->process_list.empty()) { - if (simix_global->process_list.size() <= daemons_.size()) { + if (time < 0. && actors_to_run_.empty() && not actor_list_.empty()) { + if (actor_list_.size() <= daemons_.size()) { XBT_CRITICAL("Oops! Daemon actors cannot do any blocking activity (communications, synchronization, etc) " "once the simulation is over. Please fix your on_exit() functions."); } else { XBT_CRITICAL("Oops! Deadlock or code not perfectly clean."); } - simix_global->display_all_actor_status(); + display_all_actor_status(); simgrid::s4u::Engine::on_deadlock(); - for (auto const& kv : simix_global->process_list) { + for (auto const& kv : actor_list_) { XBT_DEBUG("Kill %s", kv.second->get_cname()); simix_global->maestro_->kill(kv.second); } } } while (time > -1.0 || has_actors_to_run()); - if (not simix_global->process_list.empty()) + if (not actor_list_.empty()) THROW_IMPOSSIBLE; simgrid::s4u::Engine::on_simulation_end(); diff --git a/src/kernel/EngineImpl.hpp b/src/kernel/EngineImpl.hpp index 5095243a11..ebf440fb3c 100644 --- a/src/kernel/EngineImpl.hpp +++ b/src/kernel/EngineImpl.hpp @@ -10,12 +10,23 @@ #include #include #include +#include #include +#include "src/kernel/activity/ExecImpl.hpp" +#include "src/kernel/activity/IoImpl.hpp" +#include "src/kernel/activity/MailboxImpl.hpp" +#include "src/kernel/activity/SleepImpl.hpp" +#include "src/kernel/activity/SynchroRaw.hpp" +#include "src/kernel/actor/ActorImpl.hpp" + +#include #include +#include #include #include #include +#include namespace simgrid { namespace kernel { @@ -32,10 +43,28 @@ class EngineImpl { std::set daemons_; std::vector actors_to_run_; std::vector actors_that_ran_; + std::map actor_list_; + boost::intrusive::list, + &actor::ActorImpl::kernel_destroy_list_hook>> + actors_to_destroy_; +#if SIMGRID_HAVE_MC + /* MCer cannot read members actor_list_ and actors_to_destroy_ above in the remote process, so we copy the info it + * needs in a dynar. + * FIXME: This is supposed to be a temporary hack. + * A better solution would be to change the split between MCer and MCed, where the responsibility + * to compute the list of the enabled transitions goes to the MCed. + * That way, the MCer would not need to have the list of actors on its side. + * These info could be published by the MCed to the MCer in a way inspired of vd.so + */ + xbt_dynar_t actors_vector_ = xbt_dynar_new(sizeof(actor::ActorImpl*), nullptr); + xbt_dynar_t dead_actors_vector_ = xbt_dynar_new(sizeof(actor::ActorImpl*), nullptr); +#endif std::vector> tasks; std::vector> tasksTemp; + std::mutex mutex_; friend s4u::Engine; public: @@ -71,20 +100,45 @@ public: return res->second; } void add_daemon(actor::ActorImpl* d) { daemons_.insert(d); } - void rm_daemon(actor::ActorImpl* d); - void add_actor_to_run_list(actor::ActorImpl* a); - void add_actor_to_run_list_no_check(actor::ActorImpl* a); + void remove_daemon(actor::ActorImpl* d); + void add_actor_to_run_list(actor::ActorImpl* actor); + void add_actor_to_run_list_no_check(actor::ActorImpl* actor); + void add_actor_to_destroy_list(actor::ActorImpl& actor) { actors_to_destroy_.push_back(actor); } + bool has_actors_to_run() { return not actors_to_run_.empty(); } const actor::ActorImpl* get_first_actor_to_run() const { return actors_to_run_.front(); } const actor::ActorImpl* get_actor_to_run_at(unsigned long int i) const { return actors_to_run_[i]; } - unsigned long int get_actor_to_run_count() { return actors_to_run_.size(); } + unsigned long int get_actor_to_run_count() const { return actors_to_run_.size(); } + size_t get_actor_count() const { return actor_list_.size(); } + actor::ActorImpl* get_actor_by_pid(aid_t pid); + void add_actor(aid_t pid, actor::ActorImpl* actor) { actor_list_[pid] = actor; } + void remove_actor(aid_t pid) { actor_list_.erase(pid); } + +#if SIMGRID_HAVE_MC + xbt_dynar_t get_actors_vector() const { return actors_vector_; } + xbt_dynar_t get_dead_actors_vector() const { return dead_actors_vector_; } + void reset_actor_dynar() { xbt_dynar_reset(actors_vector_); } + void add_actor_to_dynar(actor::ActorImpl* actor) { xbt_dynar_push_as(actors_vector_, actor::ActorImpl*, actor); } + void add_dead_actor_to_dynar(actor::ActorImpl* actor) + { + xbt_dynar_push_as(dead_actors_vector_, actor::ActorImpl*, actor); + } +#endif + const std::map& get_actor_list() const { return actor_list_; } const std::vector& get_actors_to_run() const { return actors_to_run_; } const std::vector& get_actors_that_ran() const { return actors_that_ran_; } + std::mutex& get_mutex() { return mutex_; } bool execute_tasks(); void add_task(xbt::Task&& t) { tasks.push_back(std::move(t)); } void wake_all_waiting_actors() const; + /** + * Garbage collection + * + * Should be called some time to time to free the memory allocated for actors that have finished (or killed). + */ + void empty_trash(); void display_all_actor_status() const; void run_all_actors(); diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index fe6c717db4..a54c8c7f42 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -52,15 +52,7 @@ unsigned long* get_maxpid_addr() } ActorImpl* ActorImpl::by_pid(aid_t pid) { - auto item = simix_global->process_list.find(pid); - if (item != simix_global->process_list.end()) - return item->second; - - // Search the trash - for (auto& a : simix_global->actors_to_destroy) - if (a.get_pid() == pid) - return &a; - return nullptr; // Not found, even in the trash + return EngineImpl::get_instance()->get_actor_by_pid(pid); } ActorImpl* ActorImpl::self() @@ -94,7 +86,7 @@ ActorImpl::~ActorImpl() ActorImplPtr ActorImpl::attach(const std::string& name, void* data, s4u::Host* host) { // This is mostly a copy/paste from create(), it'd be nice to share some code between those two functions. - + auto* engine = EngineImpl::get_instance(); XBT_DEBUG("Attach actor %s on host '%s'", name.c_str(), host->get_cname()); if (not host->is_on()) { @@ -115,8 +107,8 @@ ActorImplPtr ActorImpl::attach(const std::string& name, void* data, s4u::Host* h host->get_impl()->add_actor(actor); /* Now insert it in the global actor list and in the actors to run list */ - simix_global->process_list[actor->get_pid()] = actor; - EngineImpl::get_instance()->add_actor_to_run_list_no_check(actor); + engine->add_actor(actor->get_pid(), actor); + engine->add_actor_to_run_list_no_check(actor); intrusive_ptr_add_ref(actor); auto* context = dynamic_cast(actor->context_.get()); @@ -145,15 +137,16 @@ void ActorImpl::detach() void ActorImpl::cleanup_from_simix() { - const std::lock_guard lock(simix_global->mutex); - simix_global->process_list.erase(pid_); + auto* engine = EngineImpl::get_instance(); + const std::lock_guard lock(engine->get_mutex()); + engine->remove_actor(pid_); if (host_ && host_actor_list_hook.is_linked()) host_->get_impl()->remove_actor(this); - if (not smx_destroy_list_hook.is_linked()) { + if (not kernel_destroy_list_hook.is_linked()) { #if SIMGRID_HAVE_MC - xbt_dynar_push_as(simix_global->dead_actors_vector, ActorImpl*, this); + engine->add_dead_actor_to_dynar(this); #endif - simix_global->actors_to_destroy.push_back(*this); + engine->add_actor_to_destroy_list(*this); } } @@ -260,7 +253,7 @@ void ActorImpl::kill(ActorImpl* actor) const void ActorImpl::kill_all() const { - for (auto const& kv : simix_global->process_list) + for (auto const& kv : EngineImpl::get_instance()->get_actor_list()) if (kv.second != this) this->kill(kv.second); } @@ -332,7 +325,7 @@ void ActorImpl::undaemonize() { if (daemon_) { daemon_ = false; - EngineImpl::get_instance()->rm_daemon(this); + EngineImpl::get_instance()->remove_daemon(this); } } @@ -467,6 +460,7 @@ ActorImplPtr ActorImpl::init(const std::string& name, s4u::Host* host) const ActorImpl* ActorImpl::start(const ActorCode& code) { xbt_assert(code && host_ != nullptr, "Invalid parameters"); + auto* engine = EngineImpl::get_instance(); if (not host_->is_on()) { XBT_WARN("Cannot launch actor '%s' on failed host '%s'", name_.c_str(), host_->get_cname()); @@ -482,10 +476,10 @@ ActorImpl* ActorImpl::start(const ActorCode& code) /* Add the actor to its host's actor list */ host_->get_impl()->add_actor(this); - simix_global->process_list[pid_] = this; + engine->add_actor(pid_, this); /* Now insert it in the global actor list and in the actor to run list */ - EngineImpl::get_instance()->add_actor_to_run_list_no_check(this); + engine->add_actor_to_run_list_no_check(this); return this; } @@ -530,7 +524,7 @@ void create_maestro(const std::function& code) int SIMIX_process_count() // XBT_ATTRIB_DEPRECATED_v329 { - return simix_global->process_list.size(); + return simgrid::kernel::EngineImpl::get_instance()->get_actor_list().size(); } void* SIMIX_process_self_get_data() // XBT_ATTRIB_DEPRECATED_v329 diff --git a/src/kernel/actor/ActorImpl.hpp b/src/kernel/actor/ActorImpl.hpp index 35d16ff6ff..289e3aedd8 100644 --- a/src/kernel/actor/ActorImpl.hpp +++ b/src/kernel/actor/ActorImpl.hpp @@ -43,7 +43,7 @@ public: double get_kill_time() const; void set_kill_time(double kill_time); boost::intrusive::list_member_hook<> host_actor_list_hook; /* simgrid::surf::HostImpl::actor_list_ */ - boost::intrusive::list_member_hook<> smx_destroy_list_hook; /* simix_global->actors_to_destroy */ + boost::intrusive::list_member_hook<> kernel_destroy_list_hook; /* EngineImpl actors_to_destroy */ boost::intrusive::list_member_hook<> smx_synchro_hook; /* {mutex,cond,sem}->sleeping */ const xbt::string& get_name() const { return name_; } diff --git a/src/mc/mc_base.cpp b/src/mc/mc_base.cpp index 7c83510872..2f7aa44621 100644 --- a/src/mc/mc_base.cpp +++ b/src/mc/mc_base.cpp @@ -56,12 +56,12 @@ void execute_actors() } } #if SIMGRID_HAVE_MC - xbt_dynar_reset(simix_global->actors_vector); - for (std::pair const& kv : simix_global->process_list) { + engine->reset_actor_dynar(); + for (auto const& kv : engine->get_actor_list()) { auto actor = kv.second; if (actor->simcall_.observer_ != nullptr) actor->simcall_.mc_max_consider_ = actor->simcall_.observer_->get_max_consider(); - xbt_dynar_push_as(simix_global->actors_vector, smx_actor_t, actor); + engine->add_actor_to_dynar(actor); } #endif } diff --git a/src/mc/mc_smx.cpp b/src/mc/mc_smx.cpp index ce5800f2e0..cc216b8bfd 100644 --- a/src/mc/mc_smx.cpp +++ b/src/mc/mc_smx.cpp @@ -16,10 +16,10 @@ using simgrid::mc::remote; * This is implemented by: * * - `model_checker->process.smx_process_infos` - * (copy of `simix_global->process_list`); + * (copy of `EngineImpl::actor_list_`); * * - `model_checker->process.smx_old_process_infos` - * (copy of `simix_global->actors_to_destroy`); + * (copy of `EngineImpl::actors_to_destroy_`); * * - `model_checker->hostnames`. * diff --git a/src/mc/remote/AppSide.cpp b/src/mc/remote/AppSide.cpp index 8622f6a175..27b560ddb6 100644 --- a/src/mc/remote/AppSide.cpp +++ b/src/mc/remote/AppSide.cpp @@ -5,6 +5,7 @@ #include "src/mc/remote/AppSide.hpp" #include "src/internal_config.h" +#include "src/kernel/EngineImpl.hpp" #include "src/kernel/actor/ActorImpl.hpp" #include "src/kernel/actor/SimcallObserver.hpp" #include "src/mc/mc_base.hpp" @@ -72,9 +73,9 @@ AppSide* AppSide::initialize() xbt_assert(errno == 0 && raise(SIGSTOP) == 0, "Could not wait for the model-checker (errno = %d: %s)", errno, strerror(errno)); - s_mc_message_initial_addresses_t message{ - MessageType::INITIAL_ADDRESSES, mmalloc_preinit(), simgrid::kernel::actor::get_maxpid_addr(), - simgrid::simix::simix_global_get_actors_addr(), simgrid::simix::simix_global_get_dead_actors_addr()}; + s_mc_message_initial_addresses_t message{MessageType::INITIAL_ADDRESSES, mmalloc_preinit(), + kernel::actor::get_maxpid_addr(), simix::simix_global_get_actors_addr(), + simix::simix_global_get_dead_actors_addr()}; xbt_assert(instance_->channel_.send(message) == 0, "Could not send the initial message with addresses."); instance_->handle_messages(); @@ -83,11 +84,12 @@ AppSide* AppSide::initialize() void AppSide::handle_deadlock_check(const s_mc_message_t*) const { + const auto& actor_list = kernel::EngineImpl::get_instance()->get_actor_list(); bool deadlock = false; - if (not simix_global->process_list.empty()) { + if (not actor_list.empty()) { deadlock = true; - for (auto const& kv : simix_global->process_list) - if (simgrid::mc::actor_is_enabled(kv.second)) { + for (auto const& kv : actor_list) + if (mc::actor_is_enabled(kv.second)) { deadlock = false; break; } @@ -109,7 +111,7 @@ void AppSide::handle_simcall_execute(const s_mc_message_simcall_handle_t* messag void AppSide::handle_actor_enabled(const s_mc_message_actor_enabled_t* msg) const { - bool res = simgrid::mc::actor_is_enabled(kernel::actor::ActorImpl::by_pid(msg->aid)); + bool res = mc::actor_is_enabled(kernel::actor::ActorImpl::by_pid(msg->aid)); s_mc_message_int_t answer{MessageType::ACTOR_ENABLED_REPLY, res}; channel_.send(answer); } @@ -199,7 +201,7 @@ void AppSide::handle_messages() const XBT_DEBUG("Finalize (terminate = %d)", (int)terminate_asap); if (not terminate_asap) { if (XBT_LOG_ISENABLED(mc_client, xbt_log_priority_debug)) - simix_global->display_all_actor_status(); + kernel::EngineImpl::get_instance()->display_all_actor_status(); #if HAVE_SMPI XBT_DEBUG("Smpi_enabled: %d", (int)smpi_enabled()); if (smpi_enabled()) diff --git a/src/mc/remote/RemoteProcess.hpp b/src/mc/remote/RemoteProcess.hpp index 6c4dd9632f..65d0435f39 100644 --- a/src/mc/remote/RemoteProcess.hpp +++ b/src/mc/remote/RemoteProcess.hpp @@ -222,30 +222,28 @@ private: std::vector stack_areas_; std::vector ignored_heap_; -public: - // object info - // TODO, make private (first, objectify simgrid::mc::ObjectInformation*) - std::vector> object_infos; - std::shared_ptr binary_info; - // Copies of MCed SMX data structures - /** Copy of `simix_global->process_list` + /** Copy of `EngineImpl::actor_list_` * - * See mc_smx.c. + * See mc_smx.cpp. */ std::vector smx_actors_infos; - /** Copy of `simix_global->actors_to_destroy` + /** Copy of `EngineImpl::actors_to_destroy_` * - * See mc_smx.c. + * See mc_smx.cpp. */ std::vector smx_dead_actors_infos; -private: /** State of the cache (which variables are up to date) */ int cache_flags_ = RemoteProcess::cache_none; public: + // object info + // TODO, make private (first, objectify simgrid::mc::ObjectInformation*) + std::vector> object_infos; + std::shared_ptr binary_info; + /** Address of the heap structure in the MCed process. */ RemotePtr heap_address; diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index 368cd63575..1bf454f27a 100644 --- a/src/msg/msg_process.cpp +++ b/src/msg/msg_process.cpp @@ -6,7 +6,7 @@ #include "msg_private.hpp" #include "simgrid/Exception.hpp" #include "simgrid/s4u/Host.hpp" -#include "src/simix/smx_private.hpp" +#include "src/kernel/EngineImpl.hpp" /******************************** Process ************************************/ /** @brief Creates and runs a new #msg_process_t. @@ -96,7 +96,7 @@ XBT_PUBLIC void MSG_process_set_data_cleanup(void_f_pvoid_t data_cleanup) xbt_dynar_t MSG_processes_as_dynar() // XBT_ATTRIB_DEPRECATED_v330 { xbt_dynar_t res = xbt_dynar_new(sizeof(smx_actor_t), nullptr); - for (auto const& kv : simix_global->process_list) { + for (auto const& kv : simgrid::kernel::EngineImpl::get_instance()->get_actor_list()) { smx_actor_t actor = kv.second; xbt_dynar_push(res, &actor); } diff --git a/src/s4u/s4u_Engine.cpp b/src/s4u/s4u_Engine.cpp index 8a083e16a9..f802694d46 100644 --- a/src/s4u/s4u_Engine.cpp +++ b/src/s4u/s4u_Engine.cpp @@ -16,7 +16,6 @@ #include "simgrid/simix.h" #include "src/instr/instr_private.hpp" #include "src/kernel/EngineImpl.hpp" -#include "src/simix/smx_private.hpp" // For access to simix_global->process_list #include "src/surf/network_interface.hpp" #include "surf/surf.hpp" // routing_platf. FIXME:KILLME. SOON #include @@ -40,9 +39,9 @@ Engine* Engine::instance_ = nullptr; /* That singleton is awful, but I don't see 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); - Engine::instance_ = this; } Engine::Engine(std::string name) : pimpl(new kernel::EngineImpl()) @@ -281,13 +280,13 @@ std::vector Engine::get_filtered_links(const std::function& size_t Engine::get_actor_count() const { - return simix_global->process_list.size(); + return pimpl->get_actor_count(); } std::vector Engine::get_all_actors() const { std::vector actor_list; - for (auto const& kv : simix_global->process_list) { + for (auto const& kv : pimpl->get_actor_list()) { actor_list.push_back(kv.second->get_iface()); } return actor_list; @@ -296,7 +295,7 @@ std::vector Engine::get_all_actors() const std::vector Engine::get_filtered_actors(const std::function& filter) const { std::vector actor_list; - for (auto const& kv : simix_global->process_list) { + for (auto const& kv : pimpl->get_actor_list()) { if (filter(kv.second->get_iface())) actor_list.push_back(kv.second->get_iface()); } diff --git a/src/simix/smx_global.cpp b/src/simix/smx_global.cpp index 9281df081e..d49094502b 100644 --- a/src/simix/smx_global.cpp +++ b/src/simix/smx_global.cpp @@ -11,11 +11,6 @@ #include "simgrid/sg_config.hpp" #include "src/kernel/EngineImpl.hpp" -#include "src/kernel/activity/ExecImpl.hpp" -#include "src/kernel/activity/IoImpl.hpp" -#include "src/kernel/activity/MailboxImpl.hpp" -#include "src/kernel/activity/SleepImpl.hpp" -#include "src/kernel/activity/SynchroRaw.hpp" #include "src/mc/mc_record.hpp" #include "src/mc/mc_replay.hpp" #include "src/simix/smx_private.hpp" @@ -43,7 +38,7 @@ config::Flag cfg_verbose_exit{"debug/verbose-exit", "Display the actor sta xbt_dynar_t simix_global_get_actors_addr() { #if SIMGRID_HAVE_MC - return simix_global->actors_vector; + return kernel::EngineImpl::get_instance()->get_actors_vector(); #else xbt_die("This function is intended to be used when compiling with MC"); #endif @@ -51,7 +46,7 @@ xbt_dynar_t simix_global_get_actors_addr() xbt_dynar_t simix_global_get_dead_actors_addr() { #if SIMGRID_HAVE_MC - return simix_global->dead_actors_vector; + return kernel::EngineImpl::get_instance()->get_dead_actors_vector(); #else xbt_die("This function is intended to be used when compiling with MC"); #endif @@ -65,7 +60,7 @@ XBT_ATTRIB_NORETURN static void inthandler(int) if (simgrid::simix::cfg_verbose_exit) { XBT_INFO("CTRL-C pressed. The current status will be displayed before exit (disable that behavior with option " "'debug/verbose-exit')."); - simix_global->display_all_actor_status(); + simgrid::kernel::EngineImpl::get_instance()->display_all_actor_status(); } else { XBT_INFO("CTRL-C pressed, exiting. Hiding the current process status since 'debug/verbose-exit' is set to false."); } @@ -149,55 +144,6 @@ static void install_segvhandler() namespace simgrid { namespace simix { -void Global::empty_trash() -{ - while (not actors_to_destroy.empty()) { - kernel::actor::ActorImpl* actor = &actors_to_destroy.front(); - actors_to_destroy.pop_front(); - XBT_DEBUG("Getting rid of %s (refcount: %d)", actor->get_cname(), actor->get_refcount()); - intrusive_ptr_release(actor); - } -#if SIMGRID_HAVE_MC - xbt_dynar_reset(dead_actors_vector); -#endif -} - -void Global::display_all_actor_status() const -{ - XBT_INFO("%zu actors are still running, waiting for something.", process_list.size()); - /* List the actors and their state */ - XBT_INFO("Legend of the following listing: \"Actor (@): \""); - for (auto const& kv : process_list) { - kernel::actor::ActorImpl* actor = kv.second; - - if (actor->waiting_synchro_) { - const char* synchro_description = "unknown"; - - if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) - synchro_description = "execution"; - - if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) - synchro_description = "communication"; - - if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) - synchro_description = "sleeping"; - - if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) - synchro_description = "synchronization"; - - if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) - synchro_description = "I/O"; - - XBT_INFO("Actor %ld (%s@%s): waiting for %s activity %#zx (%s) in state %d to finish", actor->get_pid(), - actor->get_cname(), actor->get_host()->get_cname(), synchro_description, - (xbt_log_no_loc ? (size_t)0xDEADBEEF : (size_t)actor->waiting_synchro_.get()), - actor->waiting_synchro_->get_cname(), (int)actor->waiting_synchro_->state_); - } else { - XBT_INFO("Actor %ld (%s@%s) simcall %s", actor->get_pid(), actor->get_cname(), actor->get_host()->get_cname(), - SIMIX_simcall_name(actor->simcall_)); - } - } -} } // namespace simix } // namespace simgrid @@ -272,7 +218,7 @@ void SIMIX_clean() } #if HAVE_SMPI - if (not simix_global->process_list.empty()) { + if (not engine->get_actor_list().empty()) { if (smpi_process()->initialized()) { xbt_die("Process exited without calling MPI_Finalize - Killing simulation"); } else { @@ -285,7 +231,7 @@ void SIMIX_clean() /* Kill all processes (but maestro) */ simix_global->maestro_->kill_all(); engine->run_all_actors(); - simix_global->empty_trash(); + engine->empty_trash(); /* Exit the SIMIX network module */ SIMIX_mailbox_exit(); @@ -294,14 +240,6 @@ void SIMIX_clean() delete simgrid::kernel::timer::kernel_timers().top().second; simgrid::kernel::timer::kernel_timers().pop(); } - /* Free the remaining data structures */ - simix_global->actors_to_destroy.clear(); - simix_global->process_list.clear(); - -#if SIMGRID_HAVE_MC - xbt_dynar_free(&simix_global->actors_vector); - xbt_dynar_free(&simix_global->dead_actors_vector); -#endif /* Let's free maestro now */ delete simix_global->maestro_; @@ -359,7 +297,7 @@ double SIMIX_timer_get_date(smx_timer_t timer) // XBT_ATTRIB_DEPRECATED_v329 void SIMIX_display_process_status() // XBT_ATTRIB_DEPRECATED_v329 { - simix_global->display_all_actor_status(); + simgrid::kernel::EngineImpl::get_instance()->display_all_actor_status(); } int SIMIX_is_maestro() diff --git a/src/simix/smx_private.hpp b/src/simix/smx_private.hpp index ddf9816859..054f2ecdf0 100644 --- a/src/simix/smx_private.hpp +++ b/src/simix/smx_private.hpp @@ -10,11 +10,6 @@ #include "src/kernel/actor/ActorImpl.hpp" #include "src/kernel/context/Context.hpp" -#include -#include -#include -#include - /********************************** Simix Global ******************************/ namespace simgrid { @@ -22,35 +17,10 @@ namespace simix { class Global { public: - /** - * Garbage collection - * - * Should be called some time to time to free the memory allocated for actors that have finished (or killed). - */ - void empty_trash(); - void display_all_actor_status() const; kernel::context::ContextFactory* context_factory = nullptr; - std::map process_list; - boost::intrusive::list, - &kernel::actor::ActorImpl::smx_destroy_list_hook>> - actors_to_destroy; -#if SIMGRID_HAVE_MC - /* MCer cannot read members process_list and actors_to_destroy above in the remote process, so we copy the info it - * needs in a dynar. - * FIXME: This is supposed to be a temporary hack. - * A better solution would be to change the split between MCer and MCed, where the responsibility - * to compute the list of the enabled transitions goes to the MCed. - * That way, the MCer would not need to have the list of actors on its side. - * These info could be published by the MCed to the MCer in a way inspired of vd.so - */ - xbt_dynar_t actors_vector = xbt_dynar_new(sizeof(kernel::actor::ActorImpl*), nullptr); - xbt_dynar_t dead_actors_vector = xbt_dynar_new(sizeof(kernel::actor::ActorImpl*), nullptr); -#endif kernel::actor::ActorImpl* maestro_ = nullptr; - std::mutex mutex; }; } } diff --git a/src/surf/HostImpl.cpp b/src/surf/HostImpl.cpp index fcb6b4d26f..3d6f18003e 100644 --- a/src/surf/HostImpl.cpp +++ b/src/surf/HostImpl.cpp @@ -6,8 +6,8 @@ #include "simgrid/kernel/routing/NetPoint.hpp" #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Host.hpp" +#include "src/kernel/EngineImpl.hpp" #include "src/plugins/vm/VirtualMachineImpl.hpp" -#include "src/simix/smx_private.hpp" #include @@ -46,7 +46,7 @@ HostImpl::~HostImpl() for (auto const& actor : actor_list_) msg += "\n\t" + std::string(actor.get_name()); - simix_global->display_all_actor_status(); + kernel::EngineImpl::get_instance()->display_all_actor_status(); xbt_die("%s", msg.c_str()); } for (auto const& arg : actors_at_boot_)