X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Ftraceloader.cpp;h=7cb07f00aa1331e814c6d7025deffe76498a36fc;hb=fc5ee3ebc5b676253892a71fc74db6584d7d412b;hp=b6eba6a0247af29645d54b4f76c20b67f255336c;hpb=ac92a2115ab3c759add836e115f108c945e0195b;p=apitrace diff --git a/gui/traceloader.cpp b/gui/traceloader.cpp index b6eba6a..7cb07f0 100644 --- a/gui/traceloader.cpp +++ b/gui/traceloader.cpp @@ -1,12 +1,13 @@ #include "traceloader.h" +#include "apitrace.h" #include #include #define FRAMES_TO_CACHE 100 static ApiTraceCall * -apiCallFromTraceCall(const Trace::Call *call, +apiCallFromTraceCall(const trace::Call *call, const QHash &helpHash, ApiTraceFrame *frame, TraceLoader *loader) @@ -27,6 +28,8 @@ TraceLoader::TraceLoader(QObject *parent) TraceLoader::~TraceLoader() { m_parser.close(); + qDeleteAll(m_signatures); + qDeleteAll(m_enumSignatures); } void TraceLoader::loadTrace(const QString &filename) @@ -35,50 +38,35 @@ void TraceLoader::loadTrace(const QString &filename) loadHelpFile(); } + if (!m_frameBookmarks.isEmpty()) { + qDeleteAll(m_signatures); + qDeleteAll(m_enumSignatures); + m_signatures.clear(); + m_enumSignatures.clear(); + m_frameBookmarks.clear(); + m_createdFrames.clear(); + m_parser.close(); + } + if (!m_parser.open(filename.toLatin1())) { qDebug() << "error: failed to open " << filename; return; } - qDebug()<<"load trace with "<contains(str, sensitivity); + delete apiCall; + return result; +} + +QVector +TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame) +{ + Q_ASSERT(currentFrame); + + if (currentFrame->isLoaded()) { + return currentFrame->calls(); + } + + if (m_parser.supportsOffsets()) { + unsigned frameIdx = currentFrame->number; + int numOfCalls = numberOfCallsInFrame(frameIdx); + + if (numOfCalls) { + quint64 binaryDataSize = 0; + QVector calls(numOfCalls); + const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx]; + + m_parser.setBookmark(frameBookmark.start); + + trace::Call *call; + int parsedCalls = 0; + while ((call = m_parser.parse_call())) { + ApiTraceCall *apiCall = + apiCallFromTraceCall(call, m_helpHash, + currentFrame, this); + calls[parsedCalls] = apiCall; + Q_ASSERT(calls[parsedCalls]); + if (apiCall->hasBinaryData()) { + QByteArray data = + apiCall->arguments()[ + apiCall->binaryDataIndex()].toByteArray(); + binaryDataSize += data.size(); + } + + ++parsedCalls; + + delete call; + + if (ApiTrace::isCallAFrameMarker(apiCall, m_frameMarker)) { + break; + } + + } + assert(parsedCalls == numOfCalls); + Q_ASSERT(parsedCalls == calls.size()); + calls.squeeze(); + + Q_ASSERT(parsedCalls == currentFrame->numChildrenToLoad()); + emit frameContentsLoaded(currentFrame, + calls, binaryDataSize); + return calls; + } + } + return QVector(); +} + +void TraceLoader::findFrameStart(ApiTraceFrame *frame) +{ + if (!frame->isLoaded()) { + loadFrame(frame); + } + emit foundFrameStart(frame); +} + +void TraceLoader::findFrameEnd(ApiTraceFrame *frame) +{ + if (!frame->isLoaded()) { + loadFrame(frame); + } + emit foundFrameEnd(frame); +} + +void TraceLoader::findCallIndex(int index) +{ + int frameIdx = callInFrame(index); + ApiTraceFrame *frame = m_createdFrames[frameIdx]; + QVector calls = fetchFrameContents(frame); + QVector::const_iterator itr; + ApiTraceCall *call = 0; + for (itr = calls.constBegin(); itr != calls.constEnd(); ++itr) { + if ((*itr)->index() == index) { + call = *itr; + } + } + Q_ASSERT(call); + emit foundCallIndex(call); +} + +void TraceLoader::search(const ApiTrace::SearchRequest &request) +{ + if (request.direction == ApiTrace::SearchRequest::Next) { + searchNext(request); + } else { + searchPrev(request); + } +} + #include "traceloader.moc"