X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1340b2bc2a098a7e87fa45ff31591d32c864dc7a..f968cbbb699423fa252994ff42de77f8671ac7eb:/src/xbt/xbt_replay.cpp diff --git a/src/xbt/xbt_replay.cpp b/src/xbt/xbt_replay.cpp index b022e52764..b889434cf9 100644 --- a/src/xbt/xbt_replay.cpp +++ b/src/xbt/xbt_replay.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010, 2012-2015, 2017. The SimGrid Team. +/* Copyright (c) 2010-2018. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -17,6 +17,7 @@ namespace xbt { std::ifstream* action_fs = nullptr; std::unordered_map action_funs; +static std::unordered_map*> action_queues; static void read_and_trim_line(std::ifstream* fs, std::string* line) { @@ -39,6 +40,7 @@ public: xbt_assert(fs->is_open(), "Cannot read replay file '%s'", filename); } ReplayReader(const ReplayReader&) = delete; + ReplayReader& operator=(const ReplayReader&) = delete; ~ReplayReader() { delete fs; @@ -54,7 +56,7 @@ bool ReplayReader::get(ReplayAction* action) return not fs->eof(); } -static ReplayAction get_action(char* name) +static ReplayAction* get_action(char* name) { ReplayAction* action; @@ -75,7 +77,7 @@ static ReplayAction get_action(char* name) // if it's for me, I'm done std::string evtname = action->front(); if (evtname.compare(name) == 0) { - return *action; + return action; } else { // Else, I have to store it for the relevant colleague std::queue* otherqueue = nullptr; @@ -94,10 +96,10 @@ static ReplayAction get_action(char* name) // Get something from my queue and return it action = myqueue->front(); myqueue->pop(); - return *action; + return action; } - return ReplayAction(); + return nullptr; } static void handle_action(ReplayAction& action) @@ -120,10 +122,11 @@ int replay_runner(int argc, char* argv[]) { if (simgrid::xbt::action_fs) { // A unique trace file while (true) { - simgrid::xbt::ReplayAction evt(std::move(simgrid::xbt::get_action(argv[0]))); - if (evt.empty()) + simgrid::xbt::ReplayAction* evt = simgrid::xbt::get_action(argv[0]); + if (!evt) break; - simgrid::xbt::handle_action(evt); + simgrid::xbt::handle_action(*evt); + delete evt; } if (action_queues.find(std::string(argv[0])) != action_queues.end()) { std::queue* myqueue = action_queues.at(std::string(argv[0])); @@ -155,7 +158,7 @@ int replay_runner(int argc, char* argv[]) * \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 \ref xbt_replay_action_runner + * This table is then used by \ref simgrid::xbt::replay_runner * * The argument of the function is the line describing the action, fields separated by spaces. *