Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Objectification of mc::RecordTrace
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Fri, 11 Feb 2022 20:42:46 +0000 (21:42 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Fri, 11 Feb 2022 20:42:46 +0000 (21:42 +0100)
src/kernel/EngineImpl.cpp
src/mc/mc_record.cpp
src/mc/mc_record.hpp

index 4e872cf..de60c79 100644 (file)
@@ -701,7 +701,7 @@ void EngineImpl::run(double max_date)
   seal_platform();
 
   if (MC_record_replay_is_active()) {
-    mc::replay(MC_record_path());
+    mc::RecordTrace::replay(MC_record_path());
     empty_trash();
     return;
   }
index 87361f3..0db71d0 100644 (file)
@@ -21,11 +21,11 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_record, mc, "Logging specific to MC record/re
 namespace simgrid {
 namespace mc {
 
-void replay(RecordTrace const& trace)
+void RecordTrace::replay()
 {
   simgrid::mc::execute_actors();
 
-  for (simgrid::mc::Transition* const transition : trace) {
+  for (simgrid::mc::Transition* const transition : transitions_) {
     XBT_DEBUG("Executing %ld$%i", transition->aid_, transition->times_considered_);
 
     // Choose a request:
@@ -41,19 +41,18 @@ void replay(RecordTrace const& trace)
   }
 }
 
-void replay(const std::string& path_string)
+void simgrid::mc::RecordTrace::replay(const std::string& path_string)
 {
   simgrid::mc::processes_time.resize(simgrid::kernel::actor::get_maxpid());
-  simgrid::mc::RecordTrace trace = simgrid::mc::parseRecordTrace(path_string.c_str());
-  simgrid::mc::replay(trace);
-  for (auto* item : trace)
+  simgrid::mc::RecordTrace trace(path_string.c_str());
+  trace.replay();
+  for (auto* item : trace.transitions_)
     delete item;
   simgrid::mc::processes_time.clear();
 }
 
-RecordTrace parseRecordTrace(const char* data)
+simgrid::mc::RecordTrace::RecordTrace(const char* data)
 {
-  RecordTrace res;
   XBT_INFO("path=%s", data);
   if (data == nullptr || data[0] == '\0')
     throw std::invalid_argument("Could not parse record path");
@@ -66,7 +65,7 @@ RecordTrace parseRecordTrace(const char* data)
 
     if(count != 2 && count != 1)
       throw std::invalid_argument("Could not parse record path");
-    res.push_back(new simgrid::mc::Transition(aid, times_considered));
+    push_back(new simgrid::mc::Transition(aid, times_considered));
 
     // Find next chunk:
     const char* end = std::strchr(current, ';');
@@ -75,17 +74,15 @@ RecordTrace parseRecordTrace(const char* data)
     else
       current = end + 1;
   }
-
-  return res;
 }
 
 #if SIMGRID_HAVE_MC
 
-std::string traceToString(simgrid::mc::RecordTrace const& trace)
+std::string simgrid::mc::RecordTrace::to_string() const
 {
   std::ostringstream stream;
-  for (auto i = trace.begin(); i != trace.end(); ++i) {
-    if (i != trace.begin())
+  for (auto i = transitions_.begin(); i != transitions_.end(); ++i) {
+    if (i != transitions_.begin())
       stream << ';';
     stream << (*i)->aid_;
     if ((*i)->times_considered_ > 0)
@@ -96,8 +93,7 @@ std::string traceToString(simgrid::mc::RecordTrace const& trace)
 
 void dumpRecordPath()
 {
-  RecordTrace trace = mc_model_checker->getChecker()->get_record_trace();
-  XBT_INFO("Path = %s", traceToString(trace).c_str());
+  XBT_INFO("Path = %s", mc_model_checker->getChecker()->get_record_trace().to_string().c_str());
 }
 
 #endif
index 9d4fe90..1f4ec51 100644 (file)
 namespace simgrid {
 namespace mc {
 
-using RecordTrace = std::vector<Transition*>;
+class RecordTrace {
+  std::vector<Transition*> transitions_;
+
+public:
+  RecordTrace() = default;
+
+  /** Build a trace that can be replayed from a string representation */
+  explicit RecordTrace(const char* data);
+  /** Make a string representation that can later be used to create a new trace */
+  std::string to_string() const;
+
+  void push_back(Transition* t) { transitions_.push_back(t); }
+
+  /** Replay all transitions of a trace */
+  void replay();
+
+  /** Parse and replay a string representation */
+  static void replay(const std::string& trace);
+};
 
-/** Convert a string representation of the path into an array of `simgrid::mc::Transition`
- */
-XBT_PRIVATE RecordTrace parseRecordTrace(const char* data);
-XBT_PRIVATE std::string traceToString(simgrid::mc::RecordTrace const& trace);
 XBT_PRIVATE void dumpRecordPath();
 
-XBT_PRIVATE void replay(RecordTrace const& trace);
-XBT_PRIVATE void replay(const std::string& trace);
 }
 }
 
-// **** Data conversion
-
 #endif