From f8498e93073ae2ad6e6e19571ecf52c9104edbd0 Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Wed, 3 Apr 2019 10:07:32 +0200 Subject: [PATCH] factoring with an ActivityImpl::clean_action() method --- src/kernel/activity/ActivityImpl.cpp | 7 ++++++- src/kernel/activity/ActivityImpl.hpp | 1 + src/kernel/activity/CommImpl.cpp | 5 +---- src/kernel/activity/CommImpl.hpp | 9 +++++---- src/kernel/activity/ExecImpl.cpp | 6 ++---- src/kernel/activity/SleepImpl.cpp | 3 ++- src/kernel/actor/ActorImpl.cpp | 17 +++-------------- src/kernel/actor/ActorImpl.hpp | 2 -- 8 files changed, 20 insertions(+), 30 deletions(-) diff --git a/src/kernel/activity/ActivityImpl.cpp b/src/kernel/activity/ActivityImpl.cpp index be0e1b0d30..da8f12d825 100644 --- a/src/kernel/activity/ActivityImpl.cpp +++ b/src/kernel/activity/ActivityImpl.cpp @@ -12,10 +12,15 @@ namespace kernel { namespace activity { ActivityImpl::~ActivityImpl() +{ + clean_action(); + XBT_DEBUG("Destroy activity %p", this); +} + +void ActivityImpl::clean_action() { if (surf_action_) { surf_action_->unref(); - XBT_DEBUG("Destroy activity %p", this); surf_action_ = nullptr; } } diff --git a/src/kernel/activity/ActivityImpl.hpp b/src/kernel/activity/ActivityImpl.hpp index 1719af4ff9..0d16180e30 100644 --- a/src/kernel/activity/ActivityImpl.hpp +++ b/src/kernel/activity/ActivityImpl.hpp @@ -35,6 +35,7 @@ public: virtual void post() = 0; // What to do when a simcall terminates virtual void finish() = 0; + virtual void clean_action(); virtual double get_remaining() const; // boost::intrusive_ptr support: friend XBT_PUBLIC void intrusive_ptr_add_ref(ActivityImpl* activity); diff --git a/src/kernel/activity/CommImpl.cpp b/src/kernel/activity/CommImpl.cpp index 5852dad6d7..8aa5747069 100644 --- a/src/kernel/activity/CommImpl.cpp +++ b/src/kernel/activity/CommImpl.cpp @@ -520,10 +520,7 @@ void CommImpl::cancel() /** @brief This is part of the cleanup process, probably an internal command */ void CommImpl::cleanupSurf() { - if (surf_action_) { - surf_action_->unref(); - surf_action_ = nullptr; - } + clean_action(); if (src_timeout_) { src_timeout_->unref(); diff --git a/src/kernel/activity/CommImpl.hpp b/src/kernel/activity/CommImpl.hpp index ca65fd0409..777d826547 100644 --- a/src/kernel/activity/CommImpl.hpp +++ b/src/kernel/activity/CommImpl.hpp @@ -27,18 +27,19 @@ public: CommImpl& set_type(CommImpl::Type type); CommImpl& set_size(double size); - double get_rate() { return rate_; } - CommImpl& set_rate(double rate); CommImpl& set_src_buff(void* buff, size_t size); CommImpl& set_dst_buff(void* buff, size_t* size); + CommImpl& set_rate(double rate); + double get_rate() { return rate_; } - CommImpl* start(); void copy_data(); + + CommImpl* start(); void suspend() override; void resume() override; + void cancel() override; void post() override; void finish() override; - void cancel() override; CommImpl::Type type_; /* Type of the communication (SIMIX_COMM_SEND or SIMIX_COMM_RECEIVE) */ MailboxImpl* mbox = nullptr; /* Rendez-vous where the comm is queued */ diff --git a/src/kernel/activity/ExecImpl.cpp b/src/kernel/activity/ExecImpl.cpp index 0e4d8ed443..5c12267a8e 100644 --- a/src/kernel/activity/ExecImpl.cpp +++ b/src/kernel/activity/ExecImpl.cpp @@ -164,10 +164,8 @@ void ExecImpl::post() on_completion(*this); - if (surf_action_) { - surf_action_->unref(); - surf_action_ = nullptr; - } + clean_action(); + if (timeout_detector_) { timeout_detector_->unref(); timeout_detector_ = nullptr; diff --git a/src/kernel/activity/SleepImpl.cpp b/src/kernel/activity/SleepImpl.cpp index d236948db8..b5b7a7ab6d 100644 --- a/src/kernel/activity/SleepImpl.cpp +++ b/src/kernel/activity/SleepImpl.cpp @@ -73,7 +73,8 @@ void SleepImpl::finish() SIMIX_simcall_answer(simcall); } } - SIMIX_process_sleep_destroy(this); + + clean_action(); } } // namespace activity } // namespace kernel diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index 8f78d87ea8..af4a2b5844 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -207,8 +207,7 @@ void ActorImpl::exit() if (exec != nullptr && exec->surf_action_) { exec->cancel(); - exec->surf_action_->unref(); - exec->surf_action_ = nullptr; + exec->clean_action(); } else if (comm != nullptr) { comms.remove(waiting_synchro); comm->cancel(); @@ -438,7 +437,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(sleep); + sleep->clean_action(); 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()) { @@ -589,7 +588,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(sleep); + sleep->clean_action(); 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()) { @@ -690,16 +689,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. * diff --git a/src/kernel/actor/ActorImpl.hpp b/src/kernel/actor/ActorImpl.hpp index f4ee3a8857..c6324ecc53 100644 --- a/src/kernel/actor/ActorImpl.hpp +++ b/src/kernel/actor/ActorImpl.hpp @@ -176,6 +176,4 @@ 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(simgrid::kernel::activity::SleepImplPtr synchro); - #endif -- 2.20.1