From: Zack Rusin Date: Thu, 15 Sep 2011 02:04:07 +0000 (-0400) Subject: Fix and cleanup state lookups on frames. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=851d0b0452234ace66a511327bd8e6f9d68fe9e9;p=apitrace Fix and cleanup state lookups on frames. --- diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index 1087cca..6f101cd 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -190,10 +190,15 @@ ApiTraceCall * ApiTrace::callWithIndex(int idx) const ApiTraceState ApiTrace::defaultState() const { ApiTraceFrame *frame = frameAt(0); - if (!frame || !frame->hasState()) + if (!frame || !frame->loaded() || frame->isEmpty()) return ApiTraceState(); - return *frame->state(); + ApiTraceCall *firstCall = frame->calls().first(); + if (!firstCall->hasState()) { + return ApiTraceState(); + } + + return *firstCall->state(); } void ApiTrace::callEdited(ApiTraceCall *call) diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index c917662..5ac8829 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -929,7 +929,8 @@ ApiTraceFrame::ApiTraceFrame(ApiTrace *parentTrace) m_parentTrace(parentTrace), m_binaryDataSize(0), m_loaded(false), - m_callsToLoad(0) + m_callsToLoad(0), + m_lastCallIndex(0) { } @@ -1112,3 +1113,17 @@ ApiTraceFrame::findPrevCall(ApiTraceCall *from, } return 0; } + +void ApiTraceFrame::setLastCallIndex(unsigned index) +{ + m_lastCallIndex = index; +} + +unsigned ApiTraceFrame::lastCallIndex() const +{ + if (m_loaded && !m_calls.isEmpty()) { + return m_calls.last()->index(); + } else { + return m_lastCallIndex; + } +} diff --git a/gui/apitracecall.h b/gui/apitracecall.h index d30bf1d..572b302 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -331,12 +331,16 @@ public: bool loaded() const; void setLoaded(bool l); + + void setLastCallIndex(unsigned index); + unsigned lastCallIndex() const; private: ApiTrace *m_parentTrace; quint64 m_binaryDataSize; QVector m_calls; bool m_loaded; unsigned m_callsToLoad; + unsigned m_lastCallIndex; }; Q_DECLARE_METATYPE(ApiTraceFrame*); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 9e7fbad..2974f31 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -268,7 +268,7 @@ void MainWindow::replayTrace(bool dumpState) qDebug()<<"tried to get a state for an empty frame"; return; } - index = frame->calls().first()->index(); + index = frame->lastCallIndex(); } else { qDebug()<<"Unknown event type"; return; @@ -873,11 +873,16 @@ void MainWindow::fillState(bool nonDefaults) m_ui.nonDefaultsCB->blockSignals(false); ApiTraceFrame *firstFrame = m_trace->frameAt(0); - ApiTraceEvent *oldSelected = m_selectedEvent; if (!firstFrame) return; + if (!firstFrame->loaded()) { + m_trace->loadFrame(firstFrame); + return; + } + ApiTraceCall *firstCall = firstFrame->calls().first(); + ApiTraceEvent *oldSelected = m_selectedEvent; m_nonDefaultsLookupEvent = m_selectedEvent; - m_selectedEvent = firstFrame; + m_selectedEvent = firstCall; lookupState(); m_selectedEvent = oldSelected; } diff --git a/gui/traceloader.cpp b/gui/traceloader.cpp index 7bd7dbd..9480f45 100644 --- a/gui/traceloader.cpp +++ b/gui/traceloader.cpp @@ -144,6 +144,7 @@ void TraceLoader::scanTrace() currentFrame = new ApiTraceFrame(); currentFrame->number = numOfFrames; currentFrame->setNumChildren(numOfCalls); + currentFrame->setLastCallIndex(call->no); frames.append(currentFrame); m_createdFrames.append(currentFrame);