X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c3f1d5e72cb2c6d34c2d7788f12ba42e0f592011..9184de69711560f747a3fbbb153a371375f2c38e:/src/kernel/actor/ActorImpl.cpp diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index b0d47c3289..cce43fc715 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -198,36 +198,22 @@ void ActorImpl::exit() /* destroy the blocking synchro if any */ if (waiting_synchro != nullptr) { + waiting_synchro->cancel(); + waiting_synchro->state_ = SIMIX_FAILED; activity::ExecImplPtr exec = boost::dynamic_pointer_cast(waiting_synchro); activity::CommImplPtr comm = boost::dynamic_pointer_cast(waiting_synchro); - activity::SleepImplPtr sleep = boost::dynamic_pointer_cast(waiting_synchro); - activity::RawImplPtr raw = boost::dynamic_pointer_cast(waiting_synchro); - activity::IoImplPtr io = boost::dynamic_pointer_cast(waiting_synchro); - - if (exec != nullptr && exec->surf_action_) { - exec->cancel(); - exec->surf_action_->unref(); - exec->surf_action_ = nullptr; + + if (exec != nullptr) { + exec->clean_action(); } else if (comm != nullptr) { comms.remove(waiting_synchro); - comm->cancel(); // Remove first occurrence of &actor->simcall: auto i = boost::range::find(waiting_synchro->simcalls_, &simcall); if (i != waiting_synchro->simcalls_.end()) waiting_synchro->simcalls_.remove(&simcall); - } else if (sleep != nullptr) { - if (sleep->surf_action_) - sleep->surf_action_->cancel(); - sleep->post(); - } else if (raw != nullptr) { - raw->finish(); - } else if (io != nullptr) { - io->cancel(); } else { - simgrid::kernel::activity::ActivityImplPtr activity = waiting_synchro; - xbt_die("Activity %s is of unknown type %s", activity->get_cname(), - simgrid::xbt::demangle(typeid(activity).name()).get()); + activity::ActivityImplPtr(waiting_synchro)->finish(); } waiting_synchro = nullptr; @@ -427,39 +413,15 @@ void ActorImpl::throw_exception(std::exception_ptr e) /* cancel the blocking synchro if any */ if (waiting_synchro) { - - activity::ExecImplPtr exec = boost::dynamic_pointer_cast(waiting_synchro); - if (exec != nullptr) - exec->cancel(); + waiting_synchro->cancel(); activity::CommImplPtr comm = boost::dynamic_pointer_cast(waiting_synchro); - if (comm != nullptr) { - comms.remove(comm); - comm->cancel(); - } - activity::SleepImplPtr sleep = boost::dynamic_pointer_cast(waiting_synchro); - if (sleep != nullptr) { - SIMIX_process_sleep_destroy(sleep); - if (std::find(begin(simix_global->actors_to_run), end(simix_global->actors_to_run), this) == - end(simix_global->actors_to_run) && - this != SIMIX_process_self()) { - XBT_DEBUG("Inserting [%p] %s in the to_run list", this, get_cname()); - simix_global->actors_to_run.push_back(this); - } - } - - activity::RawImplPtr raw = boost::dynamic_pointer_cast(waiting_synchro); - if (raw != nullptr) { - raw->finish(); - } + if (comm != nullptr) + comms.remove(comm); - activity::IoImplPtr io = boost::dynamic_pointer_cast(waiting_synchro); - if (io != nullptr) { - io->cancel(); - } + waiting_synchro = nullptr; } - waiting_synchro = nullptr; } void ActorImpl::set_host(s4u::Host* dest) @@ -568,51 +530,10 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn * transition */ void SIMIX_process_throw(smx_actor_t actor, xbt_errcat_t cat, int value, const char* msg) { - SMX_EXCEPTION(actor, cat, value, msg); - - if (actor->is_suspended()) - actor->resume(); - - /* cancel the blocking synchro if any */ - if (actor->waiting_synchro) { - - simgrid::kernel::activity::ExecImplPtr exec = - boost::dynamic_pointer_cast(actor->waiting_synchro); - if (exec != nullptr) - exec->cancel(); - - simgrid::kernel::activity::CommImplPtr comm = - boost::dynamic_pointer_cast(actor->waiting_synchro); - if (comm != nullptr) { - actor->comms.remove(comm); - comm->cancel(); - } - - simgrid::kernel::activity::SleepImplPtr sleep = - boost::dynamic_pointer_cast(actor->waiting_synchro); - if (sleep != nullptr) { - SIMIX_process_sleep_destroy(sleep); - if (std::find(begin(simix_global->actors_to_run), end(simix_global->actors_to_run), actor) == - end(simix_global->actors_to_run) && - actor != SIMIX_process_self()) { - XBT_DEBUG("Inserting [%p] %s in the to_run list", actor, actor->get_cname()); - simix_global->actors_to_run.push_back(actor); - } - } - - simgrid::kernel::activity::RawImplPtr raw = - boost::dynamic_pointer_cast(actor->waiting_synchro); - if (raw != nullptr) { - raw->finish(); - } - - simgrid::kernel::activity::IoImplPtr io = - boost::dynamic_pointer_cast(actor->waiting_synchro); - if (io != nullptr) { - io->cancel(); - } - } - actor->waiting_synchro = nullptr; + xbt_ex e(XBT_THROW_POINT, msg); + e.category = cat; + e.value = value; + actor->throw_exception(std::make_exception_ptr(e)); } void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t actor) @@ -692,16 +613,6 @@ void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration) simcall->issuer->waiting_synchro = sync; } -void SIMIX_process_sleep_destroy(simgrid::kernel::activity::SleepImplPtr sleep) -{ - XBT_DEBUG("Destroy sleep synchro %p", sleep.get()); - - if (sleep->surf_action_) { - sleep->surf_action_->unref(); - sleep->surf_action_ = nullptr; - } -} - /** * @brief Calling this function makes the process to yield. *