summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack Rusin <zack@kde.org>2011-10-07 23:55:55 -0400
committerZack Rusin <zack@kde.org>2011-10-07 23:58:23 -0400
commit18d094ea673e246a01dc318fd4d2dfd50ca2d630 (patch)
tree3603aea209f3f9e5afa0f4abd12028de40a34cfe
parent872d19acf33c19c3c6ca42255f5e86cc2c120bff (diff)
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.
-rw-r--r--gui/apitrace.cpp24
-rw-r--r--gui/apitrace.h2
2 files changed, 20 insertions, 6 deletions
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<ApiTraceFrame*, ApiTraceError> >::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<ApiTraceCall*> m_errors;
QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
+ QSet<ApiTraceFrame*> m_loadingFrames;
};
#endif