X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1590bc9ec710e9849ddfd70a02b0842ca0206dbf..321102577020b194dfb7ba89e48687952816849e:/src/kernel/actor/ActorImpl.cpp diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index 17aa4afda3..e679e0f027 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -29,7 +29,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_actor, kernel, "Logging specific to Actor's * * @return The SIMIX process */ -smx_actor_t SIMIX_process_self() // XBT_ATTRIB_DEPRECATED_v333 +simgrid::kernel::actor::ActorImpl* SIMIX_process_self() // XBT_ATTRIB_DEPRECATED_v333 { return simgrid::kernel::actor::ActorImpl::self(); } @@ -39,21 +39,9 @@ namespace kernel { namespace actor { /*------------------------- [ ActorIDTrait ] -------------------------*/ -static unsigned long maxpid = 0; -unsigned long get_maxpid() -{ - return maxpid; -} -unsigned long* get_maxpid_addr() -{ - return &maxpid; -} -ActorIDTrait::ActorIDTrait(std::string name, aid_t ppid) : name_(std::move(name)), pid_(maxpid++), ppid_(ppid) {} +unsigned long ActorIDTrait::maxpid_ = 0; -ActorImpl* ActorImpl::by_pid(aid_t pid) -{ - return EngineImpl::get_instance()->get_actor_by_pid(pid); -} +ActorIDTrait::ActorIDTrait(const std::string& name, aid_t ppid) : name_(name), pid_(maxpid_++), ppid_(ppid) {} ActorImpl* ActorImpl::self() { @@ -142,10 +130,12 @@ bool ActorImpl::is_maestro() const void ActorImpl::cleanup_from_kernel() { - xbt_assert(s4u::Actor::is_maestro(), "Cleanup_from_kernel called from '%s' on '%s'", ActorImpl::self()->get_cname(), - get_cname()); + xbt_assert(s4u::Actor::is_maestro(), "Cleanup_from_kernel must be called in maestro context"); auto* engine = EngineImpl::get_instance(); + if (engine->get_actor_by_pid(get_pid()) == nullptr) + return; // Already cleaned + engine->remove_actor(get_pid()); if (host_ && host_actor_list_hook.is_linked()) host_->get_impl()->remove_actor(this); @@ -159,6 +149,7 @@ void ActorImpl::cleanup_from_kernel() } undaemonize(); + s4u::Actor::on_termination(*get_ciface()); while (not mailboxes_.empty()) mailboxes_.back()->set_receiver(nullptr); @@ -196,8 +187,9 @@ void ActorImpl::cleanup_from_self() simcall_.timeout_cb_ = nullptr; } - set_wannadie(false); // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops - actor::simcall_answered([this] { s4u::Actor::on_termination(*get_ciface()); }); + /* maybe the actor was killed during a simcall, reset its observer */ + simcall_.observer_ = nullptr; + set_wannadie(); } @@ -247,9 +239,9 @@ void ActorImpl::kill(ActorImpl* actor) const void ActorImpl::kill_all() const { - for (auto const& kv : EngineImpl::get_instance()->get_actor_list()) - if (kv.second != this) - this->kill(kv.second); + for (auto const& [_, actor] : EngineImpl::get_instance()->get_actor_list()) + if (actor != this) + this->kill(actor); } void ActorImpl::set_kill_time(double kill_time)