Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of https://framagit.org/simgrid/simgrid
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Tue, 12 Feb 2019 13:07:48 +0000 (14:07 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Tue, 12 Feb 2019 13:07:48 +0000 (14:07 +0100)
13 files changed:
src/kernel/routing/NetZoneImpl.cpp
src/kernel/routing/RoutedZone.cpp
src/plugins/vm/VirtualMachineImpl.cpp
src/s4u/s4u_Actor.cpp
src/simdag/sd_daxloader.cpp
src/simdag/sd_dotloader.cpp
src/simix/ActorImpl.cpp
src/simix/ActorImpl.hpp
src/simix/smx_global.cpp
src/smpi/bindings/smpi_pmpi.cpp
src/smpi/plugins/ampi/ampi.cpp
src/surf/HostImpl.cpp
src/surf/xml/surfxml_sax_cb.cpp

index 006d375..e727cac 100644 (file)
@@ -126,7 +126,7 @@ void NetZoneImpl::add_route(kernel::routing::NetPoint* /*src*/, kernel::routing:
 }
 
 void NetZoneImpl::add_bypass_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                                   std::vector<resource::LinkImpl*>& link_list, bool symmetrical)
+                                   std::vector<resource::LinkImpl*>& link_list, bool /* symmetrical */)
 {
   /* Argument validity checks */
   if (gw_dst) {
index 6905ed9..de14a37 100644 (file)
@@ -121,9 +121,10 @@ void RoutedZone::get_graph(xbt_graph_t graph, std::map<std::string, xbt_node_t>*
 /* ************************************************************************** */
 /* ************************* GENERIC AUX FUNCTIONS ************************** */
 /* change a route containing link names into a route containing link entities */
-RouteCreationArgs* RoutedZone::new_extended_route(RoutingMode hierarchy, NetPoint* src, NetPoint* dst, NetPoint* gw_src,
-                                                  NetPoint* gw_dst, std::vector<resource::LinkImpl*>& link_list,
-                                                  bool symmetrical, bool change_order)
+RouteCreationArgs* RoutedZone::new_extended_route(RoutingMode hierarchy, NetPoint* /* src */, NetPoint* /* dst */,
+                                                  NetPoint* gw_src, NetPoint* gw_dst,
+                                                  std::vector<resource::LinkImpl*>& link_list, bool /* symmetrical */,
+                                                  bool change_order)
 {
   RouteCreationArgs* result = new RouteCreationArgs();
 
index 236644d..3ea3633 100644 (file)
@@ -237,7 +237,7 @@ void VirtualMachineImpl::shutdown(smx_actor_t issuer)
   for (auto& smx_process : process_list_) {
     XBT_DEBUG("kill %s@%s on behalf of %s which shutdown that VM.", smx_process.get_cname(),
               smx_process.host_->get_cname(), issuer->get_cname());
-    SIMIX_process_kill(&smx_process, issuer);
+    issuer->kill(&smx_process);
   }
 
   set_state(s4u::VirtualMachine::state::DESTROYED);
index 5380bba..3713c6d 100644 (file)
@@ -178,9 +178,9 @@ double Actor::get_kill_time()
 void Actor::kill(aid_t pid) // deprecated
 {
   smx_actor_t killer  = SIMIX_process_self();
-  smx_actor_t process = SIMIX_process_from_PID(pid);
-  if (process != nullptr) {
-    simgrid::simix::simcall([killer, process] { SIMIX_process_kill(process, killer); });
+  smx_actor_t victim  = SIMIX_process_from_PID(pid);
+  if (victim != nullptr) {
+    simgrid::simix::simcall([killer, victim] { killer->kill(victim); });
   } else {
     std::ostringstream oss;
     oss << "kill: (" << pid << ") - No such actor" << std::endl;
@@ -191,8 +191,12 @@ void Actor::kill(aid_t pid) // deprecated
 void Actor::kill()
 {
   smx_actor_t process = SIMIX_process_self();
-  simgrid::simix::simcall(
-      [this, process] { SIMIX_process_kill(pimpl_, (pimpl_ == simix_global->maestro_process) ? pimpl_ : process); });
+  simgrid::simix::simcall([this, process] {
+    if (pimpl_ == simix_global->maestro_process)
+      pimpl_->exit();
+    else
+      process->kill(pimpl_);
+  });
 }
 
 smx_actor_t Actor::get_impl()
@@ -214,7 +218,7 @@ ActorPtr Actor::by_pid(aid_t pid)
 void Actor::kill_all()
 {
   smx_actor_t self = SIMIX_process_self();
-  simgrid::simix::simcall([&self] { SIMIX_process_killall(self); });
+  simgrid::simix::simcall([self] { self->kill_all(); });
 }
 
 std::unordered_map<std::string, std::string>* Actor::get_properties()
@@ -390,8 +394,8 @@ void resume()
 
 void exit()
 {
-  smx_actor_t process = SIMIX_process_self();
-  simgrid::simix::simcall([process] { SIMIX_process_kill(process, process); });
+  smx_actor_t actor = SIMIX_process_self();
+  simgrid::simix::simcall([actor] { actor->exit(); });
 }
 
 void on_exit(std::function<void(int, void*)> fun, void* data)
index 2f04e24..54baf37 100644 (file)
 #include <algorithm>
 #include <map>
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_daxparse, sd, "Parsing DAX files");
-
 #include "dax_dtd.h"
 #include "dax_dtd.c"
 
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_daxparse, sd, "Parsing DAX files");
+
 /* Ensure that transfer tasks have unique names even though a file is used several times */
 void uniq_transfer_task_name(SD_task_t task)
 {
index ec453f7..ef435c4 100644 (file)
 #include <cstring>
 #include <unordered_map>
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files");
-
 #if HAVE_GRAPHVIZ
 #include <graphviz/cgraph.h>
 
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files");
+
 xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool schedule);
 
 static void dot_task_p_free(void *task) {
index d3852f7..eb14cb6 100644 (file)
@@ -107,13 +107,90 @@ ActorImpl::~ActorImpl()
   delete this->context_;
 }
 
+void ActorImpl::exit()
+{
+  context_->iwannadie = true;
+  blocked_            = false;
+  suspended_          = false;
+  exception           = nullptr;
+
+  // Forcefully kill the actor if its host is turned off. Not a HostFailureException because you should not survive that
+  if (host_->is_off())
+    this->throw_exception(std::make_exception_ptr(simgrid::kernel::context::StopRequest("host failed")));
+
+  /* destroy the blocking synchro if any */
+  if (waiting_synchro != nullptr) {
+
+    activity::ExecImplPtr exec   = boost::dynamic_pointer_cast<activity::ExecImpl>(waiting_synchro);
+    activity::CommImplPtr comm   = boost::dynamic_pointer_cast<activity::CommImpl>(waiting_synchro);
+    activity::SleepImplPtr sleep = boost::dynamic_pointer_cast<activity::SleepImpl>(waiting_synchro);
+    activity::RawImplPtr raw     = boost::dynamic_pointer_cast<activity::RawImpl>(waiting_synchro);
+    activity::IoImplPtr io       = boost::dynamic_pointer_cast<activity::IoImpl>(waiting_synchro);
+
+    if (exec != nullptr && exec->surf_action_) {
+      exec->cancel();
+      exec->surf_action_->unref();
+      exec->surf_action_ = nullptr;
+    } else if (comm != nullptr) {
+      comms.remove(waiting_synchro);
+      comm->cancel();
+      // Remove first occurrence of &process->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) {
+      SIMIX_synchro_stop_waiting(this, &simcall);
+    } else if (io != nullptr) {
+      io->cancel();
+    } else {
+      simgrid::kernel::activity::ActivityImplPtr activity = waiting_synchro;
+      xbt_die("Activity %s is of unknown type %s", activity->name_.c_str(),
+              simgrid::xbt::demangle(typeid(activity).name()).get());
+    }
+
+    waiting_synchro = nullptr;
+  }
+}
+
+void ActorImpl::kill(smx_actor_t actor)
+{
+  if (actor->finished_) {
+    XBT_DEBUG("Ignoring request to kill process %s@%s that is already dead", actor->get_cname(),
+              actor->host_->get_cname());
+    return;
+  }
+
+  XBT_DEBUG("Actor '%s'@%s is killing actor '%s'@%s", get_cname(), host_->get_cname(), actor->get_cname(),
+            actor->host_->get_cname());
+
+  actor->exit();
+
+  if (std::find(begin(simix_global->process_to_run), end(simix_global->process_to_run), actor) ==
+          end(simix_global->process_to_run) &&
+      actor != this) {
+    XBT_DEBUG("Inserting %s in the to_run list", actor->get_cname());
+    simix_global->process_to_run.push_back(actor);
+  }
+}
+
+void ActorImpl::kill_all()
+{
+  for (auto const& kv : simix_global->process_list)
+    if (kv.second != this)
+      this->kill(kv.second);
+}
+
 void ActorImpl::set_kill_time(double kill_time)
 {
   if (kill_time <= SIMIX_get_clock())
     return;
   XBT_DEBUG("Set kill time %f for process %s@%s", kill_time, get_cname(), host_->get_cname());
   kill_timer = SIMIX_timer_set(kill_time, [this] {
-    SIMIX_process_kill(this, nullptr);
+    this->exit();
     kill_timer = nullptr;
   });
 }
@@ -148,7 +225,7 @@ simgrid::s4u::Actor* ActorImpl::restart()
   simgrid::kernel::actor::ProcessArg arg = ProcessArg(host_, this);
 
   // kill the old process
-  SIMIX_process_kill(this, (this == simix_global->maestro_process) ? this : SIMIX_process_self());
+  (this == simix_global->maestro_process) ? this->exit() : SIMIX_process_self()->kill(this);
 
   // start the new process
   ActorImplPtr actor =
@@ -409,89 +486,6 @@ void SIMIX_process_runall()
   simix_global->process_to_run.clear();
 }
 
-/**
- * @brief Internal function to kill a SIMIX process.
- *
- * This function may be called when a SIMCALL_PROCESS_KILL simcall occurs,
- * or directly for SIMIX internal purposes.
- *
- * @param actor poor victim
- * @param issuer the actor which has sent the PROCESS_KILL. Important to not schedule twice the same actor.
- */
-void SIMIX_process_kill(smx_actor_t actor, smx_actor_t issuer)
-{
-
-  if (actor->finished_) {
-    XBT_DEBUG("Ignoring request to kill process %s@%s that is already dead", actor->get_cname(),
-              actor->host_->get_cname());
-    return;
-  }
-
-  XBT_DEBUG("Actor '%s'@%s is killing actor '%s'@%s", issuer == nullptr ? "(null)" : issuer->get_cname(),
-            (issuer == nullptr || issuer->host_ == nullptr ? "(null)" : issuer->host_->get_cname()), actor->get_cname(),
-            actor->host_->get_cname());
-
-  actor->context_->iwannadie = true;
-  actor->blocked_            = false;
-  actor->suspended_          = false;
-  actor->exception           = nullptr;
-
-  // Forcefully kill the actor if its host is turned off. Not an HostFailureException because you should not survive that
-  if (actor->host_->is_off())
-    actor->throw_exception(std::make_exception_ptr(simgrid::kernel::context::StopRequest("host failed")));
-
-  /* destroy the blocking synchro if any */
-  if (actor->waiting_synchro != nullptr) {
-
-    simgrid::kernel::activity::ExecImplPtr exec =
-        boost::dynamic_pointer_cast<simgrid::kernel::activity::ExecImpl>(actor->waiting_synchro);
-    simgrid::kernel::activity::CommImplPtr comm =
-        boost::dynamic_pointer_cast<simgrid::kernel::activity::CommImpl>(actor->waiting_synchro);
-    simgrid::kernel::activity::SleepImplPtr sleep =
-        boost::dynamic_pointer_cast<simgrid::kernel::activity::SleepImpl>(actor->waiting_synchro);
-    simgrid::kernel::activity::RawImplPtr raw =
-        boost::dynamic_pointer_cast<simgrid::kernel::activity::RawImpl>(actor->waiting_synchro);
-    simgrid::kernel::activity::IoImplPtr io =
-        boost::dynamic_pointer_cast<simgrid::kernel::activity::IoImpl>(actor->waiting_synchro);
-
-    if (exec != nullptr) {
-      if (exec->surf_action_) {
-        exec->surf_action_->cancel();
-        exec->surf_action_->unref();
-        exec->surf_action_ = nullptr;
-      }
-    } else if (comm != nullptr) {
-      actor->comms.remove(actor->waiting_synchro);
-      comm->cancel();
-      // Remove first occurrence of &process->simcall:
-      auto i = boost::range::find(actor->waiting_synchro->simcalls_, &actor->simcall);
-      if (i != actor->waiting_synchro->simcalls_.end())
-        actor->waiting_synchro->simcalls_.remove(&actor->simcall);
-    } else if (sleep != nullptr) {
-      if (sleep->surf_action_)
-        sleep->surf_action_->cancel();
-      sleep->post();
-    } else if (raw != nullptr) {
-      SIMIX_synchro_stop_waiting(actor, &actor->simcall);
-
-    } else if (io != nullptr) {
-      io->cancel();
-    } else {
-      simgrid::kernel::activity::ActivityImplPtr activity = actor->waiting_synchro;
-      xbt_die("Activity %s is of unknown type %s", activity->name_.c_str(),
-              simgrid::xbt::demangle(typeid(activity).name()).get());
-    }
-
-    actor->waiting_synchro = nullptr;
-  }
-  if (std::find(begin(simix_global->process_to_run), end(simix_global->process_to_run), actor) ==
-          end(simix_global->process_to_run) &&
-      actor != issuer) {
-    XBT_DEBUG("Inserting [%p] %s in the to_run list", actor, actor->get_cname());
-    simix_global->process_to_run.push_back(actor);
-  }
-}
-
 /** @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 actor, xbt_errcat_t cat, int value, const char* msg)
@@ -543,18 +537,6 @@ void SIMIX_process_throw(smx_actor_t actor, xbt_errcat_t cat, int value, const c
   actor->waiting_synchro = nullptr;
 }
 
-/**
- * @brief Kills all running processes.
- * @param issuer this one will not be killed
- */
-void SIMIX_process_killall(smx_actor_t issuer)
-{
-  for (auto const& kv : simix_global->process_list)
-    if (kv.second != issuer)
-      SIMIX_process_kill(kv.second, issuer);
-}
-
-
 void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t actor)
 {
   smx_activity_t sync_suspend = actor->suspend(simcall->issuer);
index e04ec22..b1dd9f9 100644 (file)
@@ -62,22 +62,22 @@ private:
   std::atomic_int_fast32_t refcount_{0};
 
 public:
-  friend void intrusive_ptr_add_ref(ActorImpl* process)
+  friend void intrusive_ptr_add_ref(ActorImpl* actor)
   {
     // std::memory_order_relaxed ought to be enough here instead of std::memory_order_seq_cst
     // But then, we have a threading issue when an actor commits a suicide:
     //  it seems that in this case, the worker thread kills the last occurrence of the actor
     //  while usually, the maestro does so. FIXME: we should change how actors suicide
-    process->refcount_.fetch_add(1, std::memory_order_seq_cst);
+    actor->refcount_.fetch_add(1, std::memory_order_seq_cst);
   }
-  friend void intrusive_ptr_release(ActorImpl* process)
+  friend void intrusive_ptr_release(ActorImpl* actor)
   {
     // inspired from http://www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html
-    if (process->refcount_.fetch_sub(1, std::memory_order_release) == 1) {
+    if (actor->refcount_.fetch_sub(1, std::memory_order_release) == 1) {
       // Make sure that any changes done on other threads before their acquire are committed before our delete
       // http://stackoverflow.com/questions/27751025/why-is-an-acquire-barrier-needed-before-deleting-the-data-in-an-atomically-refer
       std::atomic_thread_fence(std::memory_order_acquire);
-      delete process;
+      delete actor;
     }
   }
 
@@ -94,6 +94,9 @@ private:
 public:
   static ActorImplPtr create(std::string name, simix::ActorCode code, void* data, s4u::Host* host,
                              std::unordered_map<std::string, std::string>* properties, smx_actor_t parent_actor);
+  void exit();
+  void kill(smx_actor_t actor);
+  void kill_all();
 
   void daemonize();
   bool is_daemon() { return daemon_; } /** Whether this actor has been daemonized */
@@ -159,8 +162,6 @@ XBT_PUBLIC void create_maestro(std::function<void()> code);
 typedef simgrid::kernel::actor::ActorImpl* smx_actor_t;
 
 XBT_PRIVATE void SIMIX_process_runall();
-XBT_PRIVATE void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer);
-XBT_PRIVATE void SIMIX_process_killall(smx_actor_t issuer);
 XBT_PRIVATE void SIMIX_process_cleanup(smx_actor_t arg);
 XBT_PRIVATE void SIMIX_process_empty_trash();
 XBT_PRIVATE void SIMIX_process_yield(smx_actor_t self);
index 10547b1..c696cab 100644 (file)
@@ -240,7 +240,7 @@ void SIMIX_clean()
 #endif
 
   /* Kill all processes (but maestro) */
-  SIMIX_process_killall(simix_global->maestro_process);
+  simix_global->maestro_process->kill_all();
   SIMIX_context_runall();
   SIMIX_process_empty_trash();
 
@@ -470,7 +470,7 @@ void SIMIX_run()
       if (simix_global->process_list.size() == simix_global->daemons.size())
         for (auto const& dmon : simix_global->daemons) {
           XBT_DEBUG("Kill %s", dmon->get_cname());
-          SIMIX_process_kill(dmon, simix_global->maestro_process);
+          simix_global->maestro_process->kill(dmon);
         }
     }
 
index 07e616a..8d8886f 100644 (file)
@@ -122,8 +122,8 @@ int PMPI_Abort(MPI_Comm /*comm*/, int /*errorcode*/)
 {
   smpi_bench_end();
   // FIXME: should kill all processes in comm instead
-  smx_actor_t process = SIMIX_process_self();
-  simgrid::simix::simcall([process] { SIMIX_process_kill(process, process); });
+  smx_actor_t actor = SIMIX_process_self();
+  simgrid::simix::simcall([actor] { actor->exit(); });
   return MPI_SUCCESS;
 }
 
index e823b32..f18a911 100644 (file)
@@ -11,6 +11,9 @@
 #include <src/instr/instr_smpi.hpp>
 #include <xbt/replay.hpp>
 
+#include "ampi.hpp"
+#include <smpi/sampi.h>
+
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(plugin_pampi, smpi, "Logging specific to the AMPI functions");
 
 static std::vector<size_t> memory_size(500, 0); // FIXME cheinrich This needs to be dynamic
@@ -58,8 +61,6 @@ extern "C" void* _sampi_realloc(void* ptr, size_t size)
   return result;
 }
 
-#include "ampi.hpp"
-#include <smpi/sampi.h>
 namespace simgrid {
 namespace smpi {
 namespace plugin {
index 42e84f1..17788e0 100644 (file)
@@ -121,7 +121,7 @@ void HostImpl::turn_off()
     for (auto& actor : process_list_) {
       XBT_DEBUG("Killing Actor %s@%s on behalf of %s which turned off that host.", actor.get_cname(),
                 actor.host_->get_cname(), SIMIX_process_self()->get_cname());
-      SIMIX_process_kill(&actor, SIMIX_process_self());
+      SIMIX_process_self()->kill(&actor);
     }
   }
   // When a host is turned off, we want to keep only the actors that should restart for when it will boot again.
index 61961cf..1ebf07c 100644 (file)
 #include <unordered_map>
 #include <vector>
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, "Logging specific to the SURF parsing module");
-
 #include "simgrid_dtd.c"
 
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, "Logging specific to the SURF parsing module");
+
 static std::string surf_parsed_filename; // Currently parsed file (for the error messages)
 std::vector<simgrid::kernel::resource::LinkImpl*>
     parsed_link_list; /* temporary store of current list link of a route */