From: Martin Quinson Date: Mon, 15 Jun 2015 22:22:12 +0000 (+0200) Subject: SMPI replay: make sure that the replay is inited even if rank 0 is not first for... X-Git-Tag: v3_12~601 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/9c5bf90e5d5afd43baf314cb79b03c20a012d5cb?hp=997dc2f09da0d045347b95be5c4b2b774336a693 SMPI replay: make sure that the replay is inited even if rank 0 is not first for some reason --- diff --git a/include/xbt/replay.h b/include/xbt/replay.h index 675a5ad6a9..74434bc014 100644 --- a/include/xbt/replay.h +++ b/include/xbt/replay.h @@ -30,7 +30,7 @@ XBT_PUBLIC(int) xbt_replay_action_runner(int argc, char *argv[]); XBT_PUBLIC(int) _xbt_replay_is_active(void); -XBT_PUBLIC(void) _xbt_replay_action_init(void); +XBT_PUBLIC(int) _xbt_replay_action_init(void); XBT_PUBLIC(void) _xbt_replay_action_exit(void); XBT_PUBLIC(void) xbt_replay_action_register(const char *action_name, diff --git a/src/smpi/smpi_replay.c b/src/smpi/smpi_replay.c index 7eba6987c6..59c16014f9 100644 --- a/src/smpi/smpi_replay.c +++ b/src/smpi/smpi_replay.c @@ -1046,8 +1046,7 @@ void smpi_replay_init(int *argc, char***argv){ TRACE_smpi_collective_in(rank, -1, __FUNCTION__, extra); TRACE_smpi_collective_out(rank, -1, __FUNCTION__); - if (!action_funs){ - _xbt_replay_action_init(); + if (!_xbt_replay_action_init()) { xbt_replay_action_register("init", action_init); xbt_replay_action_register("finalize", action_finalize); xbt_replay_action_register("comm_size", action_comm_size); diff --git a/src/xbt/xbt_replay.c b/src/xbt/xbt_replay.c index 47ae0ee894..7f907db301 100644 --- a/src/xbt/xbt_replay.c +++ b/src/xbt/xbt_replay.c @@ -26,8 +26,8 @@ typedef struct s_replay_reader { FILE *action_fp; -xbt_dict_t action_funs; -xbt_dict_t action_queues; +xbt_dict_t action_funs = NULL; +xbt_dict_t action_queues = NULL; static char *action_line = NULL; static size_t action_len = 0; @@ -131,11 +131,18 @@ void xbt_replay_action_unregister(const char *action_name) xbt_free(lowername); } -void _xbt_replay_action_init(void) +/** @brief Initializes the replay mechanism, and returns true if (and only if) it was necessary + * + * It returns false if it was already done by another process. + */ +int _xbt_replay_action_init(void) { + if (action_funs) + return 0; is_replay_active = 1; action_funs = xbt_dict_new_homogeneous(NULL); action_queues = xbt_dict_new_homogeneous(NULL); + return 1; } void _xbt_replay_action_exit(void) @@ -143,6 +150,9 @@ void _xbt_replay_action_exit(void) xbt_dict_free(&action_queues); xbt_dict_free(&action_funs); free(action_line); + action_queues = NULL; + action_funs = NULL; + action_line = NULL; } /**