X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_loader.cpp;h=c14d815382b4680b5b13eac008df33c828e6d8a7;hb=447f4a55a01e82b0265f44212b8d439fa83750d7;hp=f2e6c6e58d18b5b3df221c9f1cc4677288634090;hpb=c9385be0ae27a206be571f342f299c8762627b56;p=apitrace diff --git a/trace_loader.cpp b/trace_loader.cpp index f2e6c6e..c14d815 100644 --- a/trace_loader.cpp +++ b/trace_loader.cpp @@ -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: " <= 5) { + std::cerr << "\tPercent scanned = " + << m_parser.percentRead() + << "..."<dump(std::cout, color); @@ -102,24 +112,27 @@ bool Loader::isCallAFrameMarker(const Trace::Call *call) const return false; } -std::vector Trace::Loader::frame(int idx) +std::vector Loader::frame(int idx) { int numOfCalls = numberOfCallsInFrame(idx); if (numOfCalls) { + const FrameBookmark &frameBookmark = m_frameBookmarks[idx]; std::vector 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();