From: Frederic Suter Date: Thu, 14 Mar 2019 15:57:45 +0000 (+0100) Subject: Merge branch 'master' of https://framagit.org/simgrid/simgrid X-Git-Tag: v3_22~96 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/1fd762bbcbc15aa4ffafe2d15df5cb650d1fa1ff?hp=19ca59d0255c2f0f93cb221ad75c01f05b50349c Merge branch 'master' of https://framagit.org/simgrid/simgrid --- diff --git a/src/kernel/activity/ActivityImpl.cpp b/src/kernel/activity/ActivityImpl.cpp index 5b5c6148e8..757667bb15 100644 --- a/src/kernel/activity/ActivityImpl.cpp +++ b/src/kernel/activity/ActivityImpl.cpp @@ -11,6 +11,15 @@ namespace simgrid { namespace kernel { namespace activity { +ActivityImpl::~ActivityImpl() +{ + if (surf_action_) { + surf_action_->unref(); + XBT_DEBUG("Destroy activity %p", this); + surf_action_ = nullptr; + } +} + void ActivityImpl::suspend() { if (surf_action_ == nullptr) diff --git a/src/kernel/activity/ActivityImpl.hpp b/src/kernel/activity/ActivityImpl.hpp index 58e146ce94..ffb02314db 100644 --- a/src/kernel/activity/ActivityImpl.hpp +++ b/src/kernel/activity/ActivityImpl.hpp @@ -24,7 +24,7 @@ class XBT_PUBLIC ActivityImpl { public: ActivityImpl() = default; explicit ActivityImpl(const std::string& name) : name_(name) {} - virtual ~ActivityImpl() = default; + virtual ~ActivityImpl(); e_smx_state_t state_ = SIMIX_WAITING; /* State of the activity */ std::list simcalls_; /* List of simcalls waiting for this activity */ resource::Action* surf_action_ = nullptr; diff --git a/src/kernel/activity/ExecImpl.cpp b/src/kernel/activity/ExecImpl.cpp index 4b66dd21bb..bffe2f5197 100644 --- a/src/kernel/activity/ExecImpl.cpp +++ b/src/kernel/activity/ExecImpl.cpp @@ -61,8 +61,6 @@ ExecImpl::ExecImpl(const std::string& name, const std::string& tracing_category) ExecImpl::~ExecImpl() { - if (surf_action_) - surf_action_->unref(); if (timeout_detector_) timeout_detector_->unref(); XBT_DEBUG("Destroy exec %p", this); diff --git a/src/kernel/activity/ExecImpl.hpp b/src/kernel/activity/ExecImpl.hpp index 74daa44dd2..e784634c3b 100644 --- a/src/kernel/activity/ExecImpl.hpp +++ b/src/kernel/activity/ExecImpl.hpp @@ -16,7 +16,7 @@ namespace activity { class XBT_PUBLIC ExecImpl : public ActivityImpl { resource::Action* timeout_detector_ = nullptr; - ~ExecImpl() override; + ~ExecImpl(); public: explicit ExecImpl(const std::string& name, const std::string& tracing_category); diff --git a/src/kernel/activity/IoImpl.cpp b/src/kernel/activity/IoImpl.cpp index 822ff10cea..1a08cb3b25 100644 --- a/src/kernel/activity/IoImpl.cpp +++ b/src/kernel/activity/IoImpl.cpp @@ -37,13 +37,6 @@ namespace simgrid { namespace kernel { namespace activity { -IoImpl::~IoImpl() -{ - if (surf_action_ != nullptr) - surf_action_->unref(); - XBT_DEBUG("Destroy io %p", this); -} - IoImplPtr IoImpl::set_name(const std::string& name) { ActivityImpl::set_name(name); diff --git a/src/kernel/activity/IoImpl.hpp b/src/kernel/activity/IoImpl.hpp index 5e50b88178..e71a11e8ea 100644 --- a/src/kernel/activity/IoImpl.hpp +++ b/src/kernel/activity/IoImpl.hpp @@ -21,9 +21,6 @@ class XBT_PUBLIC IoImpl : public ActivityImpl { sg_size_t performed_ioops_ = 0; public: - ~IoImpl() override; - IoImpl() = default; - IoImplPtr set_name(const std::string& name); IoImplPtr set_size(sg_size_t size); IoImplPtr set_type(s4u::Io::OpType type); diff --git a/src/kernel/activity/SleepImpl.cpp b/src/kernel/activity/SleepImpl.cpp index 8735baf348..fd85d9d2bc 100644 --- a/src/kernel/activity/SleepImpl.cpp +++ b/src/kernel/activity/SleepImpl.cpp @@ -18,16 +18,27 @@ namespace simgrid { namespace kernel { namespace activity { -SleepImpl::~SleepImpl() +SleepImplPtr SleepImpl::set_name(const std::string& name) { - if (surf_action_) - surf_action_->unref(); - XBT_DEBUG("Destroy activity %p", this); + ActivityImpl::set_name(name); + return this; +} + +SleepImplPtr SleepImpl::set_host(s4u::Host* host) +{ + host_ = host; + return this; } -SleepImpl* SleepImpl::start(double duration) +SleepImplPtr SleepImpl::set_duration(double duration) { - surf_action_ = host_->pimpl_cpu->sleep(duration); + duration_ = duration; + return this; +} + +SleepImpl* SleepImpl::start() +{ + surf_action_ = host_->pimpl_cpu->sleep(duration_); surf_action_->set_data(this); XBT_DEBUG("Create sleep synchronization %p", this); return this; @@ -73,7 +84,6 @@ void SleepImpl::post() SIMIX_simcall_answer(simcall); } } - SIMIX_process_sleep_destroy(this); } void SleepImpl::finish() diff --git a/src/kernel/activity/SleepImpl.hpp b/src/kernel/activity/SleepImpl.hpp index 2bf4657a3b..30a004c509 100644 --- a/src/kernel/activity/SleepImpl.hpp +++ b/src/kernel/activity/SleepImpl.hpp @@ -14,15 +14,16 @@ namespace kernel { namespace activity { class XBT_PUBLIC SleepImpl : public ActivityImpl { - ~SleepImpl() override; + sg_host_t host_ = nullptr; + double duration_ = 0; public: - explicit SleepImpl(const std::string& name, s4u::Host* host) : ActivityImpl(name), host_(host) {} + SleepImplPtr set_name(const std::string& name); + SleepImplPtr set_host(s4u::Host* host); + SleepImplPtr set_duration(double duration); void post() override; void finish() override; - SleepImpl* start(double duration); - - sg_host_t host_ = nullptr; + SleepImpl* start(); }; } // namespace activity } // namespace kernel diff --git a/src/kernel/activity/SynchroRaw.cpp b/src/kernel/activity/SynchroRaw.cpp index d58e1e4e18..d736bbf275 100644 --- a/src/kernel/activity/SynchroRaw.cpp +++ b/src/kernel/activity/SynchroRaw.cpp @@ -27,11 +27,6 @@ RawImpl* RawImpl::start(s4u::Host* host, double timeout) return this; } -RawImpl::~RawImpl() -{ - surf_action_->unref(); -} - void RawImpl::suspend() { /* The suspension of raw synchros is delayed to when the process is rescheduled. */ diff --git a/src/kernel/activity/SynchroRaw.hpp b/src/kernel/activity/SynchroRaw.hpp index da5766bfd8..9ed5cf9951 100644 --- a/src/kernel/activity/SynchroRaw.hpp +++ b/src/kernel/activity/SynchroRaw.hpp @@ -16,7 +16,6 @@ namespace activity { /** Used to implement mutexes, semaphores and conditions */ class XBT_PUBLIC RawImpl : public ActivityImpl { public: - ~RawImpl() override; RawImpl* start(s4u::Host* host, double timeout); void suspend() override; void resume() override; diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index 1c2fcfb5f4..728f23d402 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -388,7 +388,11 @@ activity::ActivityImplPtr ActorImpl::sleep(double duration) throw_exception(std::make_exception_ptr(simgrid::HostFailureException( XBT_THROW_POINT, std::string("Host ") + host_->get_cname() + " failed, you cannot sleep there."))); - return activity::SleepImplPtr(new activity::SleepImpl("sleep", host_))->start(duration); + return activity::SleepImplPtr(new activity::SleepImpl()) + ->set_name("sleep") + ->set_host(host_) + ->set_duration(duration) + ->start(); } void ActorImpl::throw_exception(std::exception_ptr e) @@ -413,7 +417,7 @@ void ActorImpl::throw_exception(std::exception_ptr e) activity::SleepImplPtr sleep = boost::dynamic_pointer_cast(waiting_synchro); if (sleep != nullptr) { - SIMIX_process_sleep_destroy(waiting_synchro); + 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()) { @@ -564,7 +568,7 @@ void SIMIX_process_throw(smx_actor_t actor, xbt_errcat_t cat, int value, const c simgrid::kernel::activity::SleepImplPtr sleep = boost::dynamic_pointer_cast(actor->waiting_synchro); if (sleep != nullptr) { - SIMIX_process_sleep_destroy(actor->waiting_synchro); + 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()) { @@ -665,11 +669,9 @@ void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration) simcall->issuer->waiting_synchro = sync; } -void SIMIX_process_sleep_destroy(smx_activity_t synchro) +void SIMIX_process_sleep_destroy(simgrid::kernel::activity::SleepImplPtr sleep) { - XBT_DEBUG("Destroy sleep synchro %p", synchro.get()); - simgrid::kernel::activity::SleepImplPtr sleep = - boost::static_pointer_cast(synchro); + XBT_DEBUG("Destroy sleep synchro %p", sleep.get()); if (sleep->surf_action_) { sleep->surf_action_->unref(); diff --git a/src/kernel/actor/ActorImpl.hpp b/src/kernel/actor/ActorImpl.hpp index 3dc922455b..cef9f09895 100644 --- a/src/kernel/actor/ActorImpl.hpp +++ b/src/kernel/actor/ActorImpl.hpp @@ -181,6 +181,6 @@ XBT_PUBLIC void create_maestro(const std::function& code); extern void (*SMPI_switch_data_segment)(simgrid::s4u::ActorPtr actor); -XBT_PRIVATE void SIMIX_process_sleep_destroy(smx_activity_t synchro); +XBT_PRIVATE void SIMIX_process_sleep_destroy(simgrid::kernel::activity::SleepImplPtr synchro); #endif