X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/af678c21888c7284de24c9c549d809b53a3a266a..9c5bf90e5d5afd43baf314cb79b03c20a012d5cb:/src/xbt/xbt_replay.c diff --git a/src/xbt/xbt_replay.c b/src/xbt/xbt_replay.c index f3a9fbcb79..7f907db301 100644 --- a/src/xbt/xbt_replay.c +++ b/src/xbt/xbt_replay.c @@ -20,13 +20,14 @@ typedef struct s_replay_reader { char *line; size_t line_len; char *position; /* stable storage */ - char *filename; int linenum; + char *filename; + int linenum; } s_xbt_replay_reader_t; 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; @@ -130,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) @@ -142,11 +150,14 @@ 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; } /** * \ingroup XBT_replay - * \brief TODO + * \brief function used internally to actually run the replay * \param argc argc . * \param argv argv @@ -154,6 +165,7 @@ void _xbt_replay_action_exit(void) int xbt_replay_action_runner(int argc, char *argv[]) { int i; + xbt_ex_t e; if (action_fp) { // A unique trace file char **evt; while ((evt = action_get_action(argv[0]))) { @@ -161,7 +173,14 @@ int xbt_replay_action_runner(int argc, char *argv[]) action_fun function = (action_fun)xbt_dict_get(action_funs, lowername); xbt_free(lowername); - function((const char **)evt); + TRY{ + function((const char **)evt); + } + CATCH(e) { + free(evt); + xbt_die("Replay error :\n %s" + , e.msg); + } for (i=0;evt[i]!= NULL;i++) free(evt[i]); free(evt); @@ -179,7 +198,14 @@ int xbt_replay_action_runner(int argc, char *argv[]) char* lowername = str_tolower (evt[1]); action_fun function = (action_fun)xbt_dict_get(action_funs, lowername); xbt_free(lowername); - function(evt); + TRY{ + function(evt); + } + CATCH(e) { + free(evt); + xbt_die("Replay error on line %d of file %s :\n %s" + , reader->linenum,reader->filename, e.msg); + } } else { XBT_WARN("%s: Ignore trace element not for me", xbt_replay_reader_position(reader));