]> git.cworth.org Git - apitrace/blobdiff - trace_loader.cpp
Remove calls and numCalls from the ApiTrace class.
[apitrace] / trace_loader.cpp
index f2e6c6e58d18b5b3df221c9f1cc4677288634090..c14d815382b4680b5b13eac008df33c828e6d8a7 100644 (file)
@@ -1,12 +1,10 @@
 #include "trace_loader.hpp"
 
-#include "trace_snappyfile.hpp"
 
 using namespace Trace;
 
 Loader::Loader()
-    : m_frameMarker(FrameMarker_SwapBuffers),
-      file(0)
+    : m_frameMarker(FrameMarker_SwapBuffers)
 {
 }
 
@@ -27,16 +25,17 @@ void Loader::setFrameMarker(Loader::FrameMarker marker)
 
 int Loader::numberOfFrames() const
 {
-    return m_frameOffsets.size();
+    return m_frameBookmarks.size();
 }
 
-int Loader::numberOfCallsInFrame(int frameIdx)
+int Loader::numberOfCallsInFrame(int frameIdx) const
 {
-    if (frameIdx > m_frameOffsets.size()) {
+    if (frameIdx > m_frameBookmarks.size()) {
         return 0;
     }
-
-    return m_frameOffsets[frameIdx].numberOfCalls;
+    FrameBookmarks::const_iterator itr =
+        m_frameBookmarks.find(frameIdx);
+    return itr->second.numberOfCalls;
 }
 
 bool Loader::open(const char *filename)
@@ -45,27 +44,38 @@ bool Loader::open(const char *filename)
         std::cerr << "error: failed to open " << filename << "\n";
         return false;
     }
+    if (!m_parser.supportsOffsets()) {
+        std::cerr << "error: " <<filename<< " doesn't support seeking "
+                  << "\n";
+        return false;
+    }
 
     Trace::Call *call;
-    File::Offset startOffset;
+    ParseBookmark startBookmark;
     int numOfFrames = 0;
     int numOfCalls = 0;
+    int lastPercentReport = 0;
 
-    startOffset = m_parser.currentOffset();
-
-    while ((call = m_parser.parse_call())) {
+    m_parser.getBookmark(startBookmark);
 
+    while ((call = m_parser.scan_call())) {
         ++numOfCalls;
 
         if (isCallAFrameMarker(call)) {
-            File::Offset endOffset = m_parser.currentOffset();
-            FrameOffset frameOffset(startOffset, endOffset);
+            FrameBookmark frameBookmark(startBookmark);
+            frameBookmark.numberOfCalls = numOfCalls;
 
-            frameOffset.numberOfCalls = numOfCalls;
-            m_frameOffsets[numOfFrames] = frameOffset;
+            m_frameBookmarks[numOfFrames] = frameBookmark;
             ++numOfFrames;
 
-            startOffset = endOffset;
+            if (m_parser.percentRead() - lastPercentReport >= 5) {
+                std::cerr << "\tPercent scanned = "
+                          << m_parser.percentRead()
+                          << "..."<<std::endl;
+                lastPercentReport = m_parser.percentRead();
+            }
+            
+            m_parser.getBookmark(startBookmark);
             numOfCalls = 0;
         }
         //call->dump(std::cout, color);
@@ -102,24 +112,27 @@ bool Loader::isCallAFrameMarker(const Trace::Call *call) const
     return false;
 }
 
-std::vector<Trace::Call *> Trace::Loader::frame(int idx)
+std::vector<Trace::Call *> Loader::frame(int idx)
 {
     int numOfCalls = numberOfCallsInFrame(idx);
     if (numOfCalls) {
+        const FrameBookmark &frameBookmark = m_frameBookmarks[idx];
         std::vector<Trace::Call*> calls(numOfCalls);
-        m_parser.setCurrentOffset(m_frameOffsets[idx].start);
+        m_parser.setBookmark(frameBookmark.start);
 
         Trace::Call *call;
         int parsedCalls = 0;
         while ((call = m_parser.parse_call())) {
 
+            calls[parsedCalls] = call;
+            ++parsedCalls;
+
             if (isCallAFrameMarker(call)) {
                 break;
             }
 
-            calls[parsedCalls] = call;
-            ++parsedCalls;
         }
+        assert(parsedCalls == numOfCalls);
         return calls;
     }
     return std::vector<Trace::Call*>();