]> git.cworth.org Git - apitrace/blobdiff - trace_loader.cpp
First working implementation of on-demand-loading of frames/calls.
[apitrace] / trace_loader.cpp
index f2e6c6e58d18b5b3df221c9f1cc4677288634090..254d2cb0af61fdfe1b68692fb99e54fcdd50741b 100644 (file)
@@ -45,6 +45,11 @@ 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;
@@ -102,7 +107,7 @@ 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) {
@@ -113,13 +118,15 @@ std::vector<Trace::Call *> Trace::Loader::frame(int idx)
         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*>();