]> git.cworth.org Git - apitrace/blobdiff - trace_loader.cpp
Merge remote-tracking branch 'origin/master' into on-demand-loading
[apitrace] / trace_loader.cpp
index f2e6c6e58d18b5b3df221c9f1cc4677288634090..08066a94c9630e0114617401dc1fabdd0782fb7e 100644 (file)
@@ -30,13 +30,14 @@ int Loader::numberOfFrames() const
     return m_frameOffsets.size();
 }
 
-int Loader::numberOfCallsInFrame(int frameIdx)
+int Loader::numberOfCallsInFrame(int frameIdx) const
 {
     if (frameIdx > m_frameOffsets.size()) {
         return 0;
     }
-
-    return m_frameOffsets[frameIdx].numberOfCalls;
+    FrameOffsets::const_iterator itr =
+        m_frameOffsets.find(frameIdx);
+    return itr->second.numberOfCalls;
 }
 
 bool Loader::open(const char *filename)
@@ -45,27 +46,35 @@ 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;
     int numOfFrames = 0;
     int numOfCalls = 0;
+    unsigned callNum = 0;
 
     startOffset = m_parser.currentOffset();
+    callNum = m_parser.currentCallNumber();
 
-    while ((call = m_parser.parse_call())) {
-
+    while ((call = m_parser.scan_call())) {
         ++numOfCalls;
 
         if (isCallAFrameMarker(call)) {
             File::Offset endOffset = m_parser.currentOffset();
-            FrameOffset frameOffset(startOffset, endOffset);
-
+            FrameOffset frameOffset(startOffset);
             frameOffset.numberOfCalls = numOfCalls;
+            frameOffset.callNumber = callNum;
+
             m_frameOffsets[numOfFrames] = frameOffset;
             ++numOfFrames;
 
             startOffset = endOffset;
+            callNum = m_parser.currentCallNumber();
             numOfCalls = 0;
         }
         //call->dump(std::cout, color);
@@ -102,24 +111,28 @@ 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 FrameOffset &frameOffset = m_frameOffsets[idx];
         std::vector<Trace::Call*> calls(numOfCalls);
-        m_parser.setCurrentOffset(m_frameOffsets[idx].start);
+        m_parser.setCurrentOffset(frameOffset.start);
+        m_parser.setCurrentCallNumber(frameOffset.callNumber);
 
         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*>();