Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SMPI] Replay: Use std::bind / std::function for the wait action
authorChristian Heinrich <franz-christian.heinrich@inria.fr>
Mon, 26 Mar 2018 15:33:31 +0000 (17:33 +0200)
committerChristian Heinrich <franz-christian.heinrich@inria.fr>
Wed, 28 Mar 2018 15:33:52 +0000 (17:33 +0200)
src/smpi/internals/smpi_replay.cpp

index ad2f04f..e8630b9 100644 (file)
@@ -101,13 +101,14 @@ protected:
   int my_proc_id;
 
 public:
   int my_proc_id;
 
 public:
-  explicit ReplayAction(std::string name)
-      : name(name), start_time(smpi_process()->simulated_elapsed()), my_proc_id(simgrid::s4u::Actor::self()->getPid())
+  explicit ReplayAction(std::string name) : name(name), start_time(0), my_proc_id(simgrid::s4u::Actor::self()->getPid())
   {
   }
 
   virtual void execute(simgrid::xbt::ReplayAction& action)
   {
   {
   }
 
   virtual void execute(simgrid::xbt::ReplayAction& action)
   {
+    // Needs to be re-initialized for every action, hence here
+    start_time = smpi_process()->simulated_elapsed();
     args.parse(action);
     kernel(action);
     log_timed_action(action, start_time);
     args.parse(action);
     kernel(action);
     log_timed_action(action, start_time);
@@ -311,11 +312,6 @@ static void action_test(simgrid::xbt::ReplayAction& action)
   log_timed_action (action, clock);
 }
 
   log_timed_action (action, clock);
 }
 
-static void action_wait(simgrid::xbt::ReplayAction& action)
-{
-  Replay::WaitAction().execute(action);
-}
-
 static void action_waitall(simgrid::xbt::ReplayAction& action)
 {
   CHECK_ACTION_PARAMS(action, 0, 0)
 static void action_waitall(simgrid::xbt::ReplayAction& action)
 {
   CHECK_ACTION_PARAMS(action, 0, 0)
@@ -831,7 +827,9 @@ void smpi_replay_init(int* argc, char*** argv)
   xbt_replay_action_register("recv",       simgrid::smpi::action_recv);
   xbt_replay_action_register("Irecv",      simgrid::smpi::action_Irecv);
   xbt_replay_action_register("test",       simgrid::smpi::action_test);
   xbt_replay_action_register("recv",       simgrid::smpi::action_recv);
   xbt_replay_action_register("Irecv",      simgrid::smpi::action_Irecv);
   xbt_replay_action_register("test",       simgrid::smpi::action_test);
-  xbt_replay_action_register("wait",       simgrid::smpi::action_wait);
+  std::shared_ptr<simgrid::smpi::Replay::WaitAction> wait(new simgrid::smpi::Replay::WaitAction());
+  xbt_replay_action_register("wait",
+                             std::bind(&simgrid::smpi::Replay::WaitAction::execute, wait, std::placeholders::_1));
   xbt_replay_action_register("waitAll",    simgrid::smpi::action_waitall);
   xbt_replay_action_register("barrier",    simgrid::smpi::action_barrier);
   xbt_replay_action_register("bcast",      simgrid::smpi::action_bcast);
   xbt_replay_action_register("waitAll",    simgrid::smpi::action_waitall);
   xbt_replay_action_register("barrier",    simgrid::smpi::action_barrier);
   xbt_replay_action_register("bcast",      simgrid::smpi::action_bcast);