Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
smpi_replay: make it easier to override some actions
authorMartin Quinson <martin.quinson@loria.fr>
Mon, 22 May 2017 23:03:34 +0000 (01:03 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Mon, 22 May 2017 23:03:39 +0000 (01:03 +0200)
There is even an example.

examples/smpi/replay/replay.c
include/smpi/smpi.h
src/smpi/smpi_replay.cpp
src/xbt/xbt_replay.cpp

index ea0d438..078385a 100644 (file)
@@ -14,11 +14,24 @@ static void action_blah(const char* const* args)
      args is a strings array containing the blank-separated parameters found in the trace for this event instance. */
 }
 
+action_fun previous_send;
+static void overriding_send(const char* const* args)
+{
+  (*previous_send)(args); // Just call the overriden symbol. That's a toy example.
+}
+
 int main(int argc, char *argv[]) {
+  /* Setup things and register default actions */
+  smpi_replay_init(&argc, &argv);
+
   /* Connect your callback function to the "blah" event in the trace files */
   xbt_replay_action_register("blah", action_blah);
 
+  /* The send action is an override, so we have to first save its previous value in a global */
+  previous_send = xbt_replay_action_get("send");
+  xbt_replay_action_register("send", overriding_send);
+
   /* The regular run of the replayer */
-  smpi_replay_run(&argc, &argv);
+  smpi_replay_main(&argc, &argv);
   return 0;
 }
index 2b54c71..55d2e81 100644 (file)
@@ -918,7 +918,9 @@ XBT_PUBLIC(int) smpi_process_index();
 XBT_PUBLIC(void) smpi_process_init(int *argc, char ***argv);
 
 /* Trace replay specific stuff */
-XBT_PUBLIC(void) smpi_replay_run(int *argc, char***argv);
+XBT_PUBLIC(void) smpi_replay_init(int* argc, char*** argv); // Only initialization
+XBT_PUBLIC(void) smpi_replay_main(int* argc, char*** argv); // Launch the replay once init is done
+XBT_PUBLIC(void) smpi_replay_run(int* argc, char*** argv);  // Both init and start
 
 XBT_PUBLIC(void) SMPI_app_instance_register(const char *name, xbt_main_func_t code, int num_processes);
 XBT_PUBLIC(void) SMPI_init();
index 059bd0c..558d0ec 100644 (file)
@@ -905,8 +905,9 @@ static void action_allToAllv(const char *const *action) {
 
 }} // namespace simgrid::smpi
 
-void smpi_replay_run(int *argc, char***argv){
-  /* First initializes everything */
+/** @brief Only initialize the replay, don't do it for real */
+void smpi_replay_init(int* argc, char*** argv)
+{
   simgrid::smpi::Process::init(argc, argv);
   smpi_process()->mark_as_initialized();
   smpi_process()->set_replaying(true);
@@ -916,10 +917,8 @@ void smpi_replay_run(int *argc, char***argv){
   TRACE_smpi_computing_init(rank);
   instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
   extra->type = TRACING_INIT;
-  char *operation =bprintf("%s_init",__FUNCTION__);
-  TRACE_smpi_collective_in(rank, -1, operation, extra);
-  TRACE_smpi_collective_out(rank, -1, operation);
-  xbt_free(operation);
+  TRACE_smpi_collective_in(rank, -1, "smpi_replay_run_init", extra);
+  TRACE_smpi_collective_out(rank, -1, "smpi_replay_run_init");
   xbt_replay_action_register("init",       simgrid::smpi::action_init);
   xbt_replay_action_register("finalize",   simgrid::smpi::action_finalize);
   xbt_replay_action_register("comm_size",  simgrid::smpi::action_comm_size);
@@ -947,10 +946,7 @@ void smpi_replay_run(int *argc, char***argv){
 
   //if we have a delayed start, sleep here.
   if(*argc>2){
-    char *endptr;
-    double value = strtod((*argv)[2], &endptr);
-    if (*endptr != '\0')
-      THROWF(unknown_error, 0, "%s is not a double", (*argv)[2]);
+    double value = xbt_str_parse_double((*argv)[2], "%s is not a double");
     XBT_VERB("Delayed start for instance - Sleeping for %f flops ",value );
     smpi_execute_flops(value);
   } else {
@@ -958,8 +954,11 @@ void smpi_replay_run(int *argc, char***argv){
     XBT_DEBUG("Force context switch by smpi_execute_flops  - Sleeping for 0.0 flops ");
     smpi_execute_flops(0.0);
   }
+}
 
-  /* Actually run the replay */
+/** @brief actually run the replay after initialization */
+void smpi_replay_main(int* argc, char*** argv)
+{
   simgrid::xbt::replay_runner(*argc, *argv);
 
   /* and now, finalize everything */
@@ -989,12 +988,17 @@ void smpi_replay_run(int *argc, char***argv){
 
   instr_extra_data extra_fin = xbt_new0(s_instr_extra_data_t,1);
   extra_fin->type = TRACING_FINALIZE;
-  operation =bprintf("%s_finalize",__FUNCTION__);
-  TRACE_smpi_collective_in(rank, -1, operation, extra_fin);
+  TRACE_smpi_collective_in(smpi_process()->index(), -1, "smpi_replay_run_finalize", extra_fin);
 
   smpi_process()->finalize();
 
-  TRACE_smpi_collective_out(rank, -1, operation);
+  TRACE_smpi_collective_out(smpi_process()->index(), -1, "smpi_replay_run_finalize");
   TRACE_smpi_finalize(smpi_process()->index());
-  xbt_free(operation);
+}
+
+/** @brief chain a replay initialization and a replay start */
+void smpi_replay_run(int* argc, char*** argv)
+{
+  smpi_replay_init(argc, argv);
+  smpi_replay_main(argc, argv);
 }
index 86f8c7c..c05deb6 100644 (file)
@@ -36,7 +36,7 @@ public:
   {
          XBT_VERB("Prepare to replay file '%s'", filename);
          fs = new std::ifstream(filename, std::ifstream::in);
-         xbt_assert(fs->is_open(), "Cannot read file %s", filename);
+          xbt_assert(fs->is_open(), "Cannot read replay file '%s'", filename);
   }
   ~ReplayReader()
   {
@@ -125,9 +125,6 @@ static void handle_action(ReplayAction* action)
 /**
  * \ingroup XBT_replay
  * \brief function used internally to actually run the replay
-
- * \param argc argc .
- * \param argv argv
  */
 int replay_runner(int argc, char* argv[])
 {