Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Tidy SIMIX_process on_exit callbacks.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 26 Mar 2019 14:06:34 +0000 (15:06 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 26 Mar 2019 14:37:12 +0000 (15:37 +0100)
This is a follow-up to commit 08e94eb0482589e4b287cbea301b84daf52635bd
"Sanitize the prototype of Actor::on_exit() callbacks".

include/simgrid/simix.h
src/kernel/actor/ActorImpl.cpp
src/kernel/actor/ActorImpl.hpp
src/s4u/s4u_Actor.cpp

index 25a83c6..1a6bb09 100644 (file)
@@ -148,12 +148,14 @@ XBT_ATTRIB_DEPRECATED_v325("Please use ActorImpl::set_user_data()") XBT_PUBLIC
 XBT_ATTRIB_DEPRECATED_v325("Please use ActorImpl::get_user_data()") XBT_PUBLIC void* SIMIX_process_self_get_data();
 XBT_ATTRIB_DEPRECATED_v325("Please manifest if you actually need this function") XBT_PUBLIC
     int SIMIX_process_has_pending_comms(smx_actor_t process);
 XBT_ATTRIB_DEPRECATED_v325("Please use ActorImpl::get_user_data()") XBT_PUBLIC void* SIMIX_process_self_get_data();
 XBT_ATTRIB_DEPRECATED_v325("Please manifest if you actually need this function") XBT_PUBLIC
     int SIMIX_process_has_pending_comms(smx_actor_t process);
-XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void* data);
+XBT_ATTRIB_DEPRECATED_v325("Please use SIMIX_process_on_exit(smx_actor_t, const std::function<void(bool)>&)") XBT_PUBLIC
+    void SIMIX_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void* data);
 SG_END_DECL()
 
 #ifdef __cplusplus
 SG_END_DECL()
 
 #ifdef __cplusplus
-XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process,
-                                      const std::function<void(bool /*failed*/, void* /*data*/)>& fun, void* data);
+XBT_ATTRIB_DEPRECATED_v325("Please use SIMIX_process_on_exit(smx_actor_t, const std::function<void(bool)>&)") XBT_PUBLIC
+    void SIMIX_process_on_exit(smx_actor_t process, const std::function<void(int, void*)>& fun, void* data);
+XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process, const std::function<void(bool /*failed*/)>& fun);
 #endif
 
 /****************************** Communication *********************************/
 #endif
 
 /****************************** Communication *********************************/
index 95dc840..2c3a48a 100644 (file)
@@ -141,11 +141,11 @@ void ActorImpl::cleanup()
   }
 
   // Execute the termination callbacks
   }
 
   // Execute the termination callbacks
-  smx_process_exit_status_t exit_status = (context_->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+  bool failed = context_->iwannadie;
   while (not on_exit.empty()) {
   while (not on_exit.empty()) {
-    s_smx_process_exit_fun_t exit_fun = on_exit.back();
+    auto exit_fun = on_exit.back();
     on_exit.pop_back();
     on_exit.pop_back();
-    (exit_fun.fun)(exit_status, exit_fun.arg);
+    exit_fun(failed);
   }
 
   /* cancel non-blocking activities */
   }
 
   /* cancel non-blocking activities */
@@ -278,18 +278,6 @@ double ActorImpl::get_kill_time()
   return kill_timer ? kill_timer->get_date() : 0;
 }
 
   return kill_timer ? kill_timer->get_date() : 0;
 }
 
-static void dying_daemon(int /*exit_status*/, void* data)
-{
-  std::vector<ActorImpl*>* vect = &simix_global->daemons;
-
-  auto it = std::find(vect->begin(), vect->end(), static_cast<ActorImpl*>(data));
-  xbt_assert(it != vect->end(), "The dying daemon is not a daemon after all. Please report that bug.");
-
-  /* Don't move the whole content since we don't really care about the order */
-  std::swap(*it, vect->back());
-  vect->pop_back();
-}
-
 void ActorImpl::yield()
 {
   XBT_DEBUG("Yield actor '%s'", get_cname());
 void ActorImpl::yield()
 {
   XBT_DEBUG("Yield actor '%s'", get_cname());
@@ -333,7 +321,15 @@ void ActorImpl::daemonize()
   if (not daemon_) {
     daemon_ = true;
     simix_global->daemons.push_back(this);
   if (not daemon_) {
     daemon_ = true;
     simix_global->daemons.push_back(this);
-    SIMIX_process_on_exit(this, dying_daemon, this);
+    SIMIX_process_on_exit(this, [this](bool) {
+      auto& vect = simix_global->daemons;
+      auto it    = std::find(vect.begin(), vect.end(), this);
+      xbt_assert(it != vect.end(), "The dying daemon is not a daemon after all. Please report that bug.");
+
+      /* Don't move the whole content since we don't really care about the order */
+      std::swap(*it, vect.back());
+      vect.pop_back();
+    });
   }
 }
 
   }
 }
 
@@ -401,17 +397,12 @@ void ActorImpl::resume()
 
 activity::ActivityImplPtr ActorImpl::join(ActorImpl* actor, double timeout)
 {
 
 activity::ActivityImplPtr ActorImpl::join(ActorImpl* actor, double timeout)
 {
-  activity::ActivityImplPtr res = this->sleep(timeout);
-  intrusive_ptr_add_ref(res.get());
-  SIMIX_process_on_exit(actor,
-                        [](int, void* arg) {
-                          auto sleep = static_cast<activity::SleepImpl*>(arg);
-                          if (sleep->surf_action_)
-                            sleep->surf_action_->finish(resource::Action::State::FINISHED);
-                          intrusive_ptr_release(sleep);
-                        },
-                        res.get());
-  return res;
+  activity::ActivityImplPtr sleep = this->sleep(timeout);
+  SIMIX_process_on_exit(actor, [sleep](bool) {
+    if (sleep->surf_action_)
+      sleep->surf_action_->finish(resource::Action::State::FINISHED);
+  });
+  return sleep;
 }
 
 activity::ActivityImplPtr ActorImpl::sleep(double duration)
 }
 
 activity::ActivityImplPtr ActorImpl::sleep(double duration)
@@ -736,14 +727,21 @@ smx_actor_t SIMIX_process_from_PID(aid_t PID)
 
 void SIMIX_process_on_exit(smx_actor_t actor, int_f_pvoid_pvoid_t fun, void* data)
 {
 
 void SIMIX_process_on_exit(smx_actor_t actor, int_f_pvoid_pvoid_t fun, void* data)
 {
-  SIMIX_process_on_exit(actor, [fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data);
+  SIMIX_process_on_exit(actor, [fun, data](bool failed) {
+    intptr_t status = failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+    fun(reinterpret_cast<void*>(status), data);
+  });
 }
 
 }
 
-void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(bool, void*)>& fun, void* data)
+void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(int, void*)>& fun, void* data)
 {
 {
-  xbt_assert(actor, "current process not found: are you in maestro context ?");
+  SIMIX_process_on_exit(actor, [fun, data](bool failed) { fun(failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS, data); });
+}
 
 
-  actor->on_exit.emplace_back(s_smx_process_exit_fun_t{fun, data});
+void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(bool /*failed*/)>& fun)
+{
+  xbt_assert(actor, "current process not found: are you in maestro context ?");
+  actor->on_exit.emplace_back(fun);
 }
 
 /** @brief Restart a process, starting it again from the beginning. */
 }
 
 /** @brief Restart a process, starting it again from the beginning. */
index cef9f09..f4ee3a8 100644 (file)
 #include <map>
 #include <memory>
 
 #include <map>
 #include <memory>
 
-struct s_smx_process_exit_fun_t {
-  std::function<void(bool, void*)> fun;
-  void* arg;
-};
-
 namespace simgrid {
 namespace kernel {
 namespace actor {
 namespace simgrid {
 namespace kernel {
 namespace actor {
@@ -70,7 +65,7 @@ public:
   activity::ActivityImplPtr waiting_synchro = nullptr; /* the current blocking synchro if any */
   std::list<activity::ActivityImplPtr> comms;          /* the current non-blocking communication synchros */
   s_smx_simcall simcall;
   activity::ActivityImplPtr waiting_synchro = nullptr; /* the current blocking synchro if any */
   std::list<activity::ActivityImplPtr> comms;          /* the current non-blocking communication synchros */
   s_smx_simcall simcall;
-  std::vector<s_smx_process_exit_fun_t> on_exit; /* list of functions executed when the process dies */
+  std::vector<std::function<void(bool)>> on_exit; /* list of functions executed when the process dies */
 
   std::function<void()> code;
   simix::Timer* kill_timer = nullptr;
 
   std::function<void()> code;
   simix::Timer* kill_timer = nullptr;
index 01c2763..6e49f99 100644 (file)
@@ -101,22 +101,22 @@ void Actor::set_auto_restart(bool autorestart)
   });
 }
 
   });
 }
 
-void Actor::on_exit(int_f_pvoid_pvoid_t fun,
-                    void* data) /* deprecated: cleanup SIMIX_process_on_exit: change prototype of second parameter and
-                                   remove the last one */
+void Actor::on_exit(int_f_pvoid_pvoid_t fun, void* data) /* deprecated */
 {
 {
-  simix::simcall([this, fun, data] { SIMIX_process_on_exit(pimpl_, fun, data); });
+  on_exit([fun, data](bool failed) {
+    intptr_t status = failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+    fun(reinterpret_cast<void*>(status), data);
+  });
 }
 
 void Actor::on_exit(const std::function<void(int, void*)>& fun, void* data) /* deprecated */
 {
 }
 
 void Actor::on_exit(const std::function<void(int, void*)>& fun, void* data) /* deprecated */
 {
-  on_exit([fun, data](bool exit) { fun(exit, data); });
+  on_exit([fun, data](bool failed) { fun(failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS, data); });
 }
 
 void Actor::on_exit(const std::function<void(bool /*failed*/)>& fun) const
 {
 }
 
 void Actor::on_exit(const std::function<void(bool /*failed*/)>& fun) const
 {
-  simix::simcall(
-      [this, fun] { SIMIX_process_on_exit(pimpl_, [fun](int a, void* /*data*/) { fun(a != 0); }, nullptr); });
+  simix::simcall([this, &fun] { SIMIX_process_on_exit(pimpl_, fun); });
 }
 
 void Actor::migrate(Host* new_host)
 }
 
 void Actor::migrate(Host* new_host)