]> git.cworth.org Git - apitrace/commitdiff
Fix a crash when loading multiple frames at once.
authorZack Rusin <zack@kde.org>
Sat, 8 Oct 2011 03:55:55 +0000 (23:55 -0400)
committerZack Rusin <zack@kde.org>
Sat, 8 Oct 2011 03:58:23 +0000 (23:58 -0400)
Happens particularly often when replay has multiple errors in
different frames and they're loaded in a rapid-fire fashion.

gui/apitrace.cpp
gui/apitrace.h

index 023a094a93f2e2867117d3861153e1f4735b90c0..c94688eaa09327bb98684515dc9fc462f8473aac 100644 (file)
@@ -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"
index d0a6be4356dc6aee5674a5973ffb85f8d7d2d278..2833f60cddf90d5063cf7b40d8f951d5b1e0181c 100644 (file)
@@ -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