X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/79328778c30dcf5d6a2bffefd8c32821c9550f7a..e9ad85cc4964fb312806817ba27c917c9d797207:/src/xbt/xbt_replay.c diff --git a/src/xbt/xbt_replay.c b/src/xbt/xbt_replay.c index ded2f58bfd..ffd80026a3 100644 --- a/src/xbt/xbt_replay.c +++ b/src/xbt/xbt_replay.c @@ -1,16 +1,17 @@ -/* Copyright (c) 2010. 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 * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "simgrid_config.h" //For getline, keep that include first -#include "gras_config.h" +#include "internal_config.h" #include #include "xbt/sysdep.h" #include "xbt/log.h" #include "xbt/str.h" #include "xbt/replay.h" +#include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(replay,xbt,"Replay trace reader"); @@ -22,11 +23,30 @@ typedef struct s_replay_reader { char *filename; int linenum; } s_xbt_replay_reader_t; +FILE *action_fp; + +xbt_dict_t action_funs; +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 const char **action_get_action(char *name); +static char *str_tolower (const char *str) +{ + char *ret = xbt_strdup (str); + int i, n = strlen (ret); + for (i = 0; i < n; i++) + ret[i] = tolower (str[i]); + return ret; +} + +int _xbt_replay_is_active(void){ + return is_replay_active; +} xbt_replay_reader_t xbt_replay_reader_new(const char *filename) { @@ -49,7 +69,7 @@ const char **xbt_replay_reader_get(xbt_replay_reader_t reader) { ssize_t read; xbt_dynar_t d; - read = getline(&reader->line, &reader->line_len, reader->fp); + read = xbt_getline(&reader->line, &reader->line_len, reader->fp); //XBT_INFO("got from trace: %s",reader->line); reader->linenum++; if (read==-1) @@ -79,11 +99,12 @@ void xbt_replay_reader_free(xbt_replay_reader_t *reader) *reader=NULL; } -/** \ingroup xbt_replay +/** + * \ingroup XBT_replay * \brief Registers a function to handle a kind of action * * Registers a function to handle a kind of action - * This table is then used by #xbt_replay_action_run + * This table is then used by \ref xbt_replay_action_runner * * The argument of the function is the line describing the action, splitted on spaces with xbt_str_split_quoted() * @@ -92,21 +113,26 @@ 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, action_name, function, NULL); + char* lowername = str_tolower (action_name); + xbt_dict_set(action_funs, lowername, function, NULL); + xbt_free(lowername); } -/** \ingroup xbt_replay +/** \ingroup XBT_replay * \brief Unregisters a function, which handled a kind of action * * \param action_name the reference name of the action. */ void xbt_replay_action_unregister(const char *action_name) { - xbt_dict_remove(action_funs, 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); } @@ -118,18 +144,30 @@ void _xbt_replay_action_exit(void) free(action_line); } +/** + * \ingroup XBT_replay + * \brief TODO + + * \param argc argc . + * \param argv argv + */ int xbt_replay_action_runner(int argc, char *argv[]) { - const char **evt; + int i; 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, evt[1]); - function(evt); + (action_fun)xbt_dict_get(action_funs, lowername); + xbt_free(lowername); + function((const char **)evt); + for (i=0;evt[i]!= NULL;i++) + free(evt[i]); free(evt); } } else { // Should have got my trace file in argument + const char **evt; xbt_assert(argc >= 2, "No '%s' agent function provided, no simulation-wide trace file provided, " "and no process-wide trace file provided in deployment file. Aborting.", @@ -138,14 +176,15 @@ 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, evt[1]); + char* lowername = str_tolower (evt[1]); + action_fun function = (action_fun)xbt_dict_get(action_funs, lowername); + xbt_free(lowername); function(evt); - free(evt); } else { XBT_WARN("%s: Ignore trace element not for me", xbt_replay_reader_position(reader)); } + free(evt); } xbt_replay_reader_free(&reader); } @@ -153,7 +192,7 @@ int xbt_replay_action_runner(int argc, char *argv[]) } -static const char **action_get_action(char *name) +static char **action_get_action(char *name) { xbt_dynar_t evt = NULL; char *evtname = NULL; @@ -166,7 +205,7 @@ static const char **action_get_action(char *name) } // Read lines until I reach something for me (which breaks in loop body) // or end of file reached - while (getline(&action_line, &action_len, action_fp) != -1) { + while (xbt_getline(&action_line, &action_len, action_fp) != -1) { // cleanup and split the string I just read char *comment = strchr(action_line, '#'); if (comment != NULL) @@ -180,7 +219,7 @@ static const char **action_get_action(char *name) // if it's for me, I'm done evtname = xbt_dynar_get_as(evt, 0, char *); - if (!strcmp(name, evtname)) { + if (!strcasecmp(name, evtname)) { return xbt_dynar_to_array(evt); } else { // Else, I have to store it for the relevant colleague