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;
}
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();
}} // 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);
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);
//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 {
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 */
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);
}