From ba747ecf0be34dbe90a464e78e67700a27642d74 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Wed, 1 Mar 2017 15:25:49 +0100 Subject: [PATCH] smpi_replay: allow to register extra events before things start (+plug a memleak) --- examples/smpi/replay/replay.c | 17 ++++++++++++++--- include/xbt/replay.h | 3 ++- src/smpi/smpi_replay.cpp | 9 ++++----- src/xbt/xbt_replay.cpp | 3 +++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/examples/smpi/replay/replay.c b/examples/smpi/replay/replay.c index 4f98b705db..7812f6c4db 100644 --- a/examples/smpi/replay/replay.c +++ b/examples/smpi/replay/replay.c @@ -1,13 +1,24 @@ -/* Copyright (c) 2009-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include +#include "xbt/replay.h" #include "smpi/smpi.h" +/* This shows how to extend the trace format by adding a new kind of events. + This function is registered through xbt_replay_action_register() below. */ +static void action_blah(const char* const* args) +{ + /* Add your answer to the blah event here. + args is a strings array containing the blank-separated parameters found in the trace for this event instance. */ +} + int main(int argc, char *argv[]) { + /* Connect your calllback function to the "blah" event in the trace files */ + xbt_replay_action_register("blah", action_blah); + + /* The regular run of the replayer */ smpi_replay_run(&argc, &argv); return 0; } diff --git a/include/xbt/replay.h b/include/xbt/replay.h index 8267a42d5f..45246190d1 100644 --- a/include/xbt/replay.h +++ b/include/xbt/replay.h @@ -8,7 +8,8 @@ #ifndef XBT_REPLAY_H #define XBT_REPLAY_H -#include "xbt/misc.h" /* SG_BEGIN_DECL */ + +#include "xbt/dict.h" SG_BEGIN_DECL() diff --git a/src/smpi/smpi_replay.cpp b/src/smpi/smpi_replay.cpp index e76971745a..1b6dd415b7 100644 --- a/src/smpi/smpi_replay.cpp +++ b/src/smpi/smpi_replay.cpp @@ -1,12 +1,10 @@ -/* Copyright (c) 2009-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ #include "private.h" -#include -#include +#include "xbt/replay.h" #include #include @@ -169,7 +167,7 @@ static void action_init(const char *const *action) static void action_finalize(const char *const *action) { - /* do nothing */ + /* Nothing to do */ } static void action_comm_size(const char *const *action) @@ -971,6 +969,7 @@ void smpi_replay_run(int *argc, char***argv){ } smpi_mpi_waitall(count_requests, requests, status); } + delete get_reqq_self(); active_processes--; if(active_processes==0){ diff --git a/src/xbt/xbt_replay.cpp b/src/xbt/xbt_replay.cpp index 2fd02d3d45..d0b7197fb3 100644 --- a/src/xbt/xbt_replay.cpp +++ b/src/xbt/xbt_replay.cpp @@ -109,6 +109,9 @@ void xbt_replay_reader_free(xbt_replay_reader_t *reader) */ void xbt_replay_action_register(const char *action_name, action_fun function) { + if (xbt_action_funs == nullptr) // If the user registers a function before the start + _xbt_replay_action_init(); + char* lowername = str_tolower (action_name); xbt_dict_set(xbt_action_funs, lowername, (void*) function, nullptr); xbt_free(lowername); -- 2.20.1