cpu: Fix TrafficGen trace playback
authorSascha Bischoff <sascha.bischoff@arm.com>
Mon, 19 Aug 2013 07:52:32 +0000 (03:52 -0400)
committerSascha Bischoff <sascha.bischoff@arm.com>
Mon, 19 Aug 2013 07:52:32 +0000 (03:52 -0400)
This patch addresses an issue with trace playback in the TrafficGen
where the trace was reset but the header was not read from the trace
when a captured trace was played back for a second time. This resulted
in parsing errors as the expected message was not found in the trace
file.

The header check is moved to an init funtion which is called by the
constructor and when the trace is reset. This ensures that the trace
header is read each time when the trace is replayed.

This patch also addresses a small formatting issue in a panic.

src/cpu/testers/traffic_gen/generators.cc
src/cpu/testers/traffic_gen/generators.hh

index 8a03e21d0e7dee758df9b0420119099d76b406b2..9d0c7e02c531d494101c1f4156e10b8784b02dbf 100644 (file)
@@ -204,14 +204,20 @@ RandomGen::nextPacketTick(bool elastic, Tick delay) const
 
 TraceGen::InputStream::InputStream(const std::string& filename)
     : trace(filename)
+{
+    init();
+}
+
+void
+TraceGen::InputStream::init()
 {
     // Create a protobuf message for the header and read it from the stream
     Message::PacketHeader header_msg;
     if (!trace.read(header_msg)) {
-        panic("Failed to read packet header from %s\n", filename);
+        panic("Failed to read packet header from trace\n");
 
         if (header_msg.tick_freq() != SimClock::Frequency) {
-            panic("Trace %s was recorded with a different tick frequency %d\n",
+            panic("Trace was recorded with a different tick frequency %d\n",
                   header_msg.tick_freq());
         }
     }
@@ -221,6 +227,7 @@ void
 TraceGen::InputStream::reset()
 {
     trace.reset();
+    init();
 }
 
 bool
index dd3706a8fe50d9c77243974ecded2cad6295bc83..fe5c5995cdcf89d98d1364f8cefa5d3f7ce77a25 100644 (file)
@@ -379,6 +379,12 @@ class TraceGen : public BaseGen
          */
         void reset();
 
+        /**
+         * Check the trace header to make sure that it is of the right
+         * format.
+         */
+        void init();
+
         /**
          * Attempt to read a trace element from the stream,
          * and also notify the caller if the end of the file