X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f9521627fe1cef73bb8eccd5b11735dcbd906dbd..f06f53287a228a869aba211842c5e46ab29b116a:/src/kernel/actor/ActorImpl.cpp diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index 992ab56b37..08199ba8ab 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -22,8 +22,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_process, simix, "Logging specific to SIMIX (process)"); -static unsigned long simix_process_maxpid = 0; - /** * @brief Returns the current agent. * @@ -53,18 +51,26 @@ namespace simgrid { namespace kernel { namespace actor { +static unsigned long maxpid = 0; +int get_maxpid() +{ + return maxpid; +} + ActorImpl::ActorImpl(const simgrid::xbt::string& name, s4u::Host* host) : host_(host), name_(name), piface_(this) { - pid_ = simix_process_maxpid++; + pid_ = maxpid++; simcall.issuer = this; } ActorImpl::~ActorImpl() { - if (this != simix_global->maestro_process) { - context_->iwannadie = false; // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops + if (simix_global != nullptr && this != simix_global->maestro_process) { + if (context_.get() != nullptr) /* the actor was not start()ed yet. This happens if its host was initially off */ + context_->iwannadie = false; // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops simgrid::simix::simcall([this] { simgrid::s4u::Actor::on_destruction(*ciface()); }); - context_->iwannadie = true; + if (context_.get() != nullptr) + context_->iwannadie = true; } } @@ -197,10 +203,6 @@ void ActorImpl::exit() suspended_ = false; exception_ = nullptr; - // Forcefully kill the actor if its host is turned off. Not a HostFailureException because you should not survive that - if (not host_->is_on()) - this->throw_exception(std::make_exception_ptr(ForcefulKillException("host failed"))); - /* destroy the blocking synchro if any */ if (waiting_synchro != nullptr) { waiting_synchro->cancel(); @@ -223,6 +225,9 @@ void ActorImpl::exit() waiting_synchro = nullptr; } + + // Forcefully kill the actor if its host is turned off. Not a HostFailureException because you should not survive that + this->throw_exception(std::make_exception_ptr(ForcefulKillException(host_->is_on() ? "exited" : "host failed"))); } void ActorImpl::kill(ActorImpl* actor) @@ -435,6 +440,20 @@ void ActorImpl::throw_exception(std::exception_ptr e) } } +void ActorImpl::simcall_answer() +{ + if (this != simix_global->maestro_process){ + XBT_DEBUG("Answer simcall %s (%d) issued by %s (%p)", SIMIX_simcall_name(simcall.call), (int)simcall.call, + get_cname(), this); + simcall.call = SIMCALL_NONE; + xbt_assert(not XBT_LOG_ISENABLED(simix_process, xbt_log_priority_debug) || + std::find(begin(simix_global->actors_to_run), end(simix_global->actors_to_run), this) == + end(simix_global->actors_to_run), + "Actor %p should not exist in actors_to_run!", this); + simix_global->actors_to_run.push_back(this); + } +} + void ActorImpl::set_host(s4u::Host* dest) { xbt::intrusive_erase(host_->pimpl_->process_list_, *this); @@ -523,14 +542,14 @@ void create_maestro(const std::function& code) } // namespace kernel } // namespace simgrid -void SIMIX_process_detach() +void SIMIX_process_detach() // deprecated v3.25 { simgrid::kernel::actor::ActorImpl::detach(); } smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostname, std::unordered_map* properties, - smx_actor_t /*parent_process*/) + smx_actor_t /*parent_process*/) // deprecated 3.25 { return simgrid::kernel::actor::ActorImpl::attach(name, data, sg_host_by_name(hostname), properties).get(); } @@ -540,7 +559,7 @@ void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t actor) smx_activity_t sync_suspend = actor->suspend(simcall->issuer); if (actor != simcall->issuer) { - SIMIX_simcall_answer(simcall); + simcall->issuer->simcall_answer(); } else { sync_suspend->simcalls_.push_back(simcall); actor->waiting_synchro = sync_suspend; @@ -549,11 +568,6 @@ void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t actor) /* If we are suspending ourselves, then just do not finish the simcall now */ } -int SIMIX_process_get_maxpid() -{ - return simix_process_maxpid; -} - int SIMIX_process_count() { return simix_global->process_list.size(); @@ -586,25 +600,12 @@ const char* SIMIX_process_self_get_name() return process->get_cname(); } -void simcall_HANDLER_process_join(smx_simcall_t simcall, smx_actor_t process, double timeout) -{ - if (process->finished_) { - // The joined process is already finished, just wake up the issuer process right away - simcall_process_sleep__set__result(simcall, SIMIX_DONE); - SIMIX_simcall_answer(simcall); - return; - } - smx_activity_t sync = simcall->issuer->join(process, timeout); - sync->simcalls_.push_back(simcall); - simcall->issuer->waiting_synchro = sync; -} - void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration) { if (MC_is_active() || MC_record_replay_is_active()) { MC_process_clock_add(simcall->issuer, duration); simcall_process_sleep__set__result(simcall, SIMIX_DONE); - SIMIX_simcall_answer(simcall); + simcall->issuer->simcall_answer(); return; } smx_activity_t sync = simcall->issuer->sleep(duration);