From: Zack Rusin Date: Sat, 8 Oct 2011 03:55:55 +0000 (-0400) Subject: Fix a crash when loading multiple frames at once. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=18d094ea673e246a01dc318fd4d2dfd50ca2d630;p=apitrace Fix a crash when loading multiple frames at once. Happens particularly often when replay has multiple errors in different frames and they're loaded in a rapid-fire fashion. --- diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index 023a094..c94688e 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -264,8 +264,11 @@ bool ApiTrace::hasErrors() const void ApiTrace::loadFrame(ApiTraceFrame *frame) { - Q_ASSERT(!frame->isLoaded()); - emit requestFrame(frame); + if (!isFrameLoading(frame)) { + Q_ASSERT(!frame->isLoaded()); + m_loadingFrames.insert(frame); + emit requestFrame(frame); + } } void ApiTrace::finishedParsing() @@ -281,9 +284,13 @@ void ApiTrace::loaderFrameLoaded(ApiTraceFrame *frame, quint64 binaryDataSize) { Q_ASSERT(frame->numChildrenToLoad() == calls.size()); - emit beginLoadingFrame(frame, calls.size()); - frame->setCalls(calls, binaryDataSize); - emit endLoadingFrame(frame); + + if (!frame->isLoaded()) { + emit beginLoadingFrame(frame, calls.size()); + frame->setCalls(calls, binaryDataSize); + emit endLoadingFrame(frame); + m_loadingFrames.remove(frame); + } if (!m_queuedErrors.isEmpty()) { QList< QPair >::iterator itr; @@ -481,9 +488,14 @@ void ApiTrace::setCallError(const ApiTraceError &error) } emit changed(call); } else { - emit requestFrame(frame); + loadFrame(frame); m_queuedErrors.append(qMakePair(frame, error)); } } +bool ApiTrace::isFrameLoading(ApiTraceFrame *frame) const +{ + return m_loadingFrames.contains(frame); +} + #include "apitrace.moc" diff --git a/gui/apitrace.h b/gui/apitrace.h index d0a6be4..2833f60 100644 --- a/gui/apitrace.h +++ b/gui/apitrace.h @@ -143,6 +143,7 @@ private slots: private: int callInFrame(int callIdx) const; + bool isFrameLoading(ApiTraceFrame *frame) const; private: QString m_fileName; QString m_tempFileName; @@ -161,6 +162,7 @@ private: QSet m_errors; QList< QPair > m_queuedErrors; + QSet m_loadingFrames; }; #endif