From 94f442070bfed66af7b861d4a432c9df6a1cdad2 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sun, 26 Aug 2018 01:14:32 +0200 Subject: [PATCH] deprecate SIMIX_process_throw for ActorImpl::throw_exception --- include/simgrid/simix.h | 3 ++- src/simix/ActorImpl.cpp | 58 ++++++++++++++++++++++++++++++++++++----- src/simix/ActorImpl.hpp | 2 ++ 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index 7f20595b19..18451af516 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -214,7 +214,8 @@ XBT_PUBLIC smx_actor_t simcall_process_create(std::string name, xbt_main_func_t std::unordered_map* properties); #endif -XBT_PUBLIC void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const char* mesg); +XBT_ATTRIB_DEPRECATED_v324("Please use ActorImpl::throw_exception") XBT_PUBLIC + void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const char* mesg); /* Process handling */ XBT_PUBLIC void simcall_process_suspend(smx_actor_t process); diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index a5bbba8106..dad7703083 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -241,6 +241,55 @@ smx_activity_t ActorImpl::sleep(double duration) return synchro; } +void ActorImpl::throw_exception(std::exception_ptr e) +{ + exception = e; + + if (suspended_) + resume(); + + /* cancel the blocking synchro if any */ + if (waiting_synchro) { + + simgrid::kernel::activity::ExecImplPtr exec = + boost::dynamic_pointer_cast(waiting_synchro); + if (exec != nullptr && exec->surf_action_) + exec->surf_action_->cancel(); + + simgrid::kernel::activity::CommImplPtr comm = + boost::dynamic_pointer_cast(waiting_synchro); + if (comm != nullptr) { + comms.remove(comm); + comm->cancel(); + } + + simgrid::kernel::activity::SleepImplPtr sleep = + boost::dynamic_pointer_cast(waiting_synchro); + if (sleep != nullptr) { + SIMIX_process_sleep_destroy(waiting_synchro); + if (std::find(begin(simix_global->process_to_run), end(simix_global->process_to_run), this) == + end(simix_global->process_to_run) && + this != SIMIX_process_self()) { + XBT_DEBUG("Inserting %s in the to_run list", get_cname()); + simix_global->process_to_run.push_back(this); + } + } + + simgrid::kernel::activity::RawImplPtr raw = + boost::dynamic_pointer_cast(waiting_synchro); + if (raw != nullptr) { + SIMIX_synchro_stop_waiting(this, &simcall); + } + + simgrid::kernel::activity::IoImplPtr io = + boost::dynamic_pointer_cast(waiting_synchro); + if (io != nullptr) { + delete io.get(); + } + } + waiting_synchro = nullptr; +} + void create_maestro(simgrid::simix::ActorCode code) { smx_actor_t maestro = nullptr; @@ -500,13 +549,8 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { } } -/** @brief Ask another process to raise the given exception - * - * @param process The process that should raise that exception - * @param cat category of exception - * @param value value associated to the exception - * @param msg string information associated to the exception - */ +/** @deprecated When this function gets removed, also remove the xbt_ex class, that is only there to help users to + * transition */ void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const char *msg) { SMX_EXCEPTION(process, cat, value, msg); diff --git a/src/simix/ActorImpl.hpp b/src/simix/ActorImpl.hpp index fda93c28bf..babf410fed 100644 --- a/src/simix/ActorImpl.hpp +++ b/src/simix/ActorImpl.hpp @@ -101,6 +101,8 @@ public: smx_activity_t sleep(double duration); void set_user_data(void* data) { userdata_ = data; } void* get_user_data() { return userdata_; } + /** Ask the actor to throw an exception right away */ + void throw_exception(std::exception_ptr e); }; class ProcessArg { -- 2.20.1