X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Fapitrace.cpp;h=ca5098d334564e069692d6cf897792723280a667;hb=1a9f7af32205d900c88fef0b544546eb0d7c84ee;hp=958009b7e383ff6a8b3ccd0984586c4174d52ee2;hpb=f682e19bee94eb69a5cfc8b2db17d7f1ebb10c2b;p=apitrace diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index 958009b..ca5098d 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -19,10 +19,33 @@ ApiTrace::ApiTrace() m_loader, SLOT(loadFrame(ApiTraceFrame*))); connect(m_loader, SIGNAL(framesLoaded(const QList)), this, SLOT(addFrames(const QList))); - connect(m_loader, SIGNAL(frameLoaded(ApiTraceFrame*)), - this, SLOT(frameLoadFinished(ApiTraceFrame*))); + connect(m_loader, + SIGNAL(frameContentsLoaded(ApiTraceFrame*,QVector,quint64)), + this, + SLOT(loaderFrameLoaded(ApiTraceFrame*,QVector,quint64))); connect(m_loader, SIGNAL(finishedParsing()), this, SLOT(finishedParsing())); + connect(this, SIGNAL(loaderSearchNext(int,QString,Qt::CaseSensitivity)), + m_loader, SLOT(searchNext(int,QString,Qt::CaseSensitivity))); + connect(this, SIGNAL(loaderSearchPrev(int,QString,Qt::CaseSensitivity)), + m_loader, SLOT(searchPrev(int,QString,Qt::CaseSensitivity))); + connect(m_loader, + SIGNAL(searchResult(ApiTrace::SearchResult,ApiTraceCall*)), + this, + SLOT(loaderSearchResult(ApiTrace::SearchResult,ApiTraceCall*))); + connect(this, SIGNAL(loaderFindFrameStart(ApiTraceFrame*)), + m_loader, SLOT(findFrameStart(ApiTraceFrame*))); + connect(this, SIGNAL(loaderFindFrameEnd(ApiTraceFrame*)), + m_loader, SLOT(findFrameEnd(ApiTraceFrame*))); + connect(m_loader, SIGNAL(foundFrameStart(ApiTraceFrame*)), + this, SIGNAL(foundFrameStart(ApiTraceFrame*))); + connect(m_loader, SIGNAL(foundFrameEnd(ApiTraceFrame*)), + this, SIGNAL(foundFrameEnd(ApiTraceFrame*))); + connect(this, SIGNAL(loaderFindCallIndex(int)), + m_loader, SLOT(findCallIndex(int))); + connect(m_loader, SIGNAL(foundCallIndex(ApiTraceCall*)), + this, SIGNAL(foundCallIndex(ApiTraceCall*))); + connect(m_loader, SIGNAL(startedParsing()), this, SIGNAL(startedLoadingTrace())); @@ -47,7 +70,6 @@ ApiTrace::~ApiTrace() { m_loaderThread->quit(); m_loaderThread->deleteLater(); - qDeleteAll(m_calls); qDeleteAll(m_frames); delete m_loader; delete m_saver; @@ -79,7 +101,7 @@ bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call, bool ApiTrace::isEmpty() const { - return m_calls.isEmpty(); + return m_frames.isEmpty(); } QString ApiTrace::fileName() const @@ -95,16 +117,6 @@ ApiTrace::FrameMarker ApiTrace::frameMarker() const return m_frameMarker; } -QVector ApiTrace::calls() const -{ - return m_calls; -} - -int ApiTrace::numCalls() const -{ - return m_calls.count(); -} - QList ApiTrace::frames() const { return m_frames; @@ -135,28 +147,15 @@ void ApiTrace::setFileName(const QString &name) m_fileName = name; m_frames.clear(); - m_calls.clear(); m_errors.clear(); m_editedCalls.clear(); m_needsSaving = false; emit invalidated(); -// m_loader->loadTrace(m_fileName); emit loadTrace(m_fileName); } } -void ApiTrace::setFrameMarker(FrameMarker marker) -{ - if (m_frameMarker != marker) { - emit framesInvalidated(); - - qDeleteAll(m_frames); - m_frames.clear(); - detectFrames(); - } -} - void ApiTrace::addFrames(const QList &frames) { QVector calls; @@ -167,57 +166,21 @@ void ApiTrace::addFrames(const QList &frames) m_frames += frames; - int currentCalls = m_calls.count(); int numNewCalls = 0; foreach(ApiTraceFrame *frame, frames) { frame->setParentTrace(this); numNewCalls += frame->numChildren(); calls += frame->calls(); } - m_calls.reserve(m_calls.count() + calls.count() + 1); - m_calls += calls; emit endAddingFrames(); - emit callsAdded(currentCalls, numNewCalls); -} - -void ApiTrace::detectFrames() -{ - if (m_calls.isEmpty()) - return; - - emit beginAddingFrames(0, m_frames.count()); - - ApiTraceFrame *currentFrame = 0; - foreach(ApiTraceCall *apiCall, m_calls) { - if (!currentFrame) { - currentFrame = new ApiTraceFrame(this); - currentFrame->number = m_frames.count(); - currentFrame->setLoaded(true); - } - apiCall->setParentFrame(currentFrame); - currentFrame->addCall(apiCall); - if (ApiTrace::isCallAFrameMarker(apiCall, - m_frameMarker)) { - m_frames.append(currentFrame); - currentFrame = 0; - } - } - //last frames won't have markers - // it's just a bunch of Delete calls for every object - // after the last SwapBuffers - if (currentFrame) { - m_frames.append(currentFrame); - currentFrame = 0; - } - emit endAddingFrames(); } ApiTraceCall * ApiTrace::callWithIndex(int idx) const { - for (int i = 0; i < m_calls.count(); ++i) { - ApiTraceCall *call = m_calls[i]; - if (call->index() == idx) + for (int i = 0; i < m_frames.count(); ++i) { + ApiTraceCall *call = m_frames[i]->callWithIndex(idx); + if (call) return call; } return NULL; @@ -226,10 +189,15 @@ ApiTraceCall * ApiTrace::callWithIndex(int idx) const ApiTraceState ApiTrace::defaultState() const { ApiTraceFrame *frame = frameAt(0); - if (!frame || !frame->hasState()) + if (!frame || !frame->isLoaded() || frame->isEmpty()) + return ApiTraceState(); + + ApiTraceCall *firstCall = frame->calls().first(); + if (!firstCall->hasState()) { return ApiTraceState(); + } - return *frame->state(); + return *firstCall->state(); } void ApiTrace::callEdited(ApiTraceCall *call) @@ -273,7 +241,9 @@ void ApiTrace::save() QDir dir; emit startedSaving(); dir.mkpath(fi.absolutePath()); - m_saver->saveFile(m_tempFileName, m_calls); + m_saver->saveFile(m_tempFileName, + m_fileName, + m_editedCalls); } void ApiTrace::slotSaved() @@ -286,18 +256,6 @@ bool ApiTrace::isSaving() const return m_saver->isRunning(); } -void ApiTrace::callError(ApiTraceCall *call) -{ - Q_ASSERT(call); - - if (call->hasError()) - m_errors.insert(call); - else - m_errors.remove(call); - - emit changed(call); -} - bool ApiTrace::hasErrors() const { return !m_errors.isEmpty(); @@ -305,22 +263,216 @@ bool ApiTrace::hasErrors() const void ApiTrace::loadFrame(ApiTraceFrame *frame) { - Q_ASSERT(!frame->loaded()); - emit beginLoadingFrame(frame, frame->numChildrenToLoad()); + Q_ASSERT(!frame->isLoaded()); emit requestFrame(frame); } void ApiTrace::finishedParsing() { ApiTraceFrame *firstFrame = m_frames[0]; - if (firstFrame && !firstFrame->loaded()) { + if (firstFrame && !firstFrame->isLoaded()) { loadFrame(firstFrame); } } -void ApiTrace::frameLoadFinished(ApiTraceFrame *frame) +void ApiTrace::loaderFrameLoaded(ApiTraceFrame *frame, + const QVector &calls, + quint64 binaryDataSize) { + Q_ASSERT(frame->numChildrenToLoad() == calls.size()); + emit beginLoadingFrame(frame, calls.size()); + frame->setCalls(calls, binaryDataSize); emit endLoadingFrame(frame); + + if (!m_queuedErrors.isEmpty()) { + QList< QPair >::iterator itr; + for (itr = m_queuedErrors.begin(); itr != m_queuedErrors.end(); + ++itr) { + const ApiTraceError &error = (*itr).second; + if ((*itr).first == frame) { + ApiTraceCall *call = frame->callWithIndex(error.callIndex); + + if (!call) { + continue; + } + + call->setError(error.message); + m_queuedErrors.erase(itr); + + if (call->hasError()) { + m_errors.insert(call); + } else { + m_errors.remove(call); + } + emit changed(call); + } + } + } +} + +void ApiTrace::findNext(ApiTraceFrame *frame, + ApiTraceCall *from, + const QString &str, + Qt::CaseSensitivity sensitivity) +{ + ApiTraceCall *foundCall = 0; + int frameIdx = m_frames.indexOf(frame); + + if (frame->isLoaded()) { + foundCall = frame->findNextCall(from, str, sensitivity); + if (foundCall) { + emit findResult(SearchResult_Found, foundCall); + return; + } + + //if the frame is loaded we already searched it above + // so skip it + frameIdx += 1; + } + + for (int i = frameIdx; i < m_frames.count(); ++i) { + ApiTraceFrame *frame = m_frames[i]; + if (!frame->isLoaded()) { + emit loaderSearchNext(i, str, sensitivity); + return; + } else { + ApiTraceCall *call = frame->findNextCall(0, str, sensitivity); + if (call) { + emit findResult(SearchResult_Found, call); + return; + } + } + } + emit findResult(SearchResult_Wrapped, 0); +} + +void ApiTrace::findPrev(ApiTraceFrame *frame, + ApiTraceCall *from, + const QString &str, + Qt::CaseSensitivity sensitivity) +{ + ApiTraceCall *foundCall = 0; + int frameIdx = m_frames.indexOf(frame); + + if (frame->isLoaded()) { + foundCall = frame->findPrevCall(from, str, sensitivity); + if (foundCall) { + emit findResult(SearchResult_Found, foundCall); + return; + } + + //if the frame is loaded we already searched it above + // so skip it + frameIdx -= 1; + } + + for (int i = frameIdx; i >= 0; --i) { + ApiTraceFrame *frame = m_frames[i]; + if (!frame->isLoaded()) { + emit loaderSearchPrev(i, str, sensitivity); + return; + } else { + ApiTraceCall *call = frame->findPrevCall(0, str, sensitivity); + if (call) { + emit findResult(SearchResult_Found, call); + return; + } + } + } + emit findResult(SearchResult_Wrapped, 0); +} + +void ApiTrace::loaderSearchResult(ApiTrace::SearchResult result, + ApiTraceCall *call) +{ + //qDebug()<<"Search result = "<