X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5a81e38fec3e63e4b514c60a0b4dd3ee461bce85..2114c044f7a785c1c53c0f69d0203fd50c2175d5:/src/xbt/xbt_replay.c diff --git a/src/xbt/xbt_replay.c b/src/xbt/xbt_replay.c index ac163cc061..47ae0ee894 100644 --- a/src/xbt/xbt_replay.c +++ b/src/xbt/xbt_replay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010, 2012-2013. The SimGrid Team. +/* Copyright (c) 2010, 2012-2014. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -20,7 +20,8 @@ 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; @@ -31,6 +32,8 @@ xbt_dict_t action_queues; static char *action_line = NULL; static size_t action_len = 0; +int is_replay_active = 0 ; + static char **action_get_action(char *name); static char *str_tolower (const char *str) @@ -42,13 +45,16 @@ static char *str_tolower (const char *str) return ret; } +int _xbt_replay_is_active(void){ + return is_replay_active; +} xbt_replay_reader_t xbt_replay_reader_new(const char *filename) { xbt_replay_reader_t res = xbt_new0(s_xbt_replay_reader_t,1); res->fp = fopen(filename, "r"); - xbt_assert(res->fp != NULL, "Cannot open %s: %s", filename, - strerror(errno)); + if (res->fp == NULL) + xbt_die("Cannot open %s: %s", filename, strerror(errno)); res->filename = xbt_strdup(filename); return res; } @@ -108,7 +114,9 @@ void xbt_replay_reader_free(xbt_replay_reader_t *reader) */ void xbt_replay_action_register(const char *action_name, action_fun function) { - xbt_dict_set(action_funs, str_tolower (action_name), function, NULL); + char* lowername = str_tolower (action_name); + xbt_dict_set(action_funs, lowername, function, NULL); + xbt_free(lowername); } /** \ingroup XBT_replay @@ -118,11 +126,14 @@ void xbt_replay_action_register(const char *action_name, action_fun function) */ void xbt_replay_action_unregister(const char *action_name) { - xbt_dict_remove(action_funs, str_tolower (action_name)); + char* lowername = str_tolower (action_name); + xbt_dict_remove(action_funs, lowername); + xbt_free(lowername); } void _xbt_replay_action_init(void) { + is_replay_active = 1; action_funs = xbt_dict_new_homogeneous(NULL); action_queues = xbt_dict_new_homogeneous(NULL); } @@ -136,7 +147,7 @@ void _xbt_replay_action_exit(void) /** * \ingroup XBT_replay - * \brief TODO + * \brief function used internally to actually run the replay * \param argc argc . * \param argv argv @@ -144,12 +155,22 @@ 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]))) { + char* lowername = str_tolower (evt[1]); action_fun function = - (action_fun)xbt_dict_get(action_funs, str_tolower (evt[1])); - function((const char **)evt); + (action_fun)xbt_dict_get(action_funs, lowername); + xbt_free(lowername); + 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); @@ -164,8 +185,17 @@ int xbt_replay_action_runner(int argc, char *argv[]) xbt_replay_reader_t reader = xbt_replay_reader_new(argv[1]); while ((evt=xbt_replay_reader_get(reader))) { if (!strcmp(argv[0],evt[0])) { - action_fun function = (action_fun)xbt_dict_get(action_funs, str_tolower (evt[1])); - function(evt); + char* lowername = str_tolower (evt[1]); + action_fun function = (action_fun)xbt_dict_get(action_funs, lowername); + xbt_free(lowername); + 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));