]> git.cworth.org Git - apitrace/commitdiff
Switch list to a vector.
authorZack Rusin <zack@kde.org>
Mon, 29 Aug 2011 02:05:31 +0000 (22:05 -0400)
committerZack Rusin <zack@kde.org>
Mon, 29 Aug 2011 02:05:31 +0000 (22:05 -0400)
further reduces memory usage by avoiding overallocation on lists

gui/apitrace.cpp
gui/apitrace.h
gui/apitracecall.cpp
gui/apitracecall.h
gui/loaderthread.cpp
gui/mainwindow.cpp
gui/saverthread.cpp
gui/saverthread.h

index 8b2eeecaa4b8115f51d6578b5041ca0a86759d57..51c4755b28194a70b635ac16d3230ef5c03623b1 100644 (file)
@@ -74,7 +74,7 @@ ApiTrace::FrameMarker ApiTrace::frameMarker() const
     return m_frameMarker;
 }
 
-QList<ApiTraceCall*> ApiTrace::calls() const
+QVector<ApiTraceCall*> ApiTrace::calls() const
 {
     return m_calls;
 }
@@ -146,7 +146,7 @@ void ApiTrace::setFrameMarker(FrameMarker marker)
 
 void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
 {
-    QList<ApiTraceCall*> calls;
+    QVector<ApiTraceCall*> calls;
     int currentFrames = m_frames.count();
     int numNewFrames = frames.count();
 
@@ -161,7 +161,7 @@ void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
         numNewCalls += frame->numChildren();
         calls += frame->calls();
     }
-    m_calls.reserve(m_calls.count() + calls.count());
+    m_calls.reserve(m_calls.count() + calls.count() + 1);
     m_calls += calls;
 
     emit endAddingFrames();
index e2c1451e733ff55d22cf47d600530fbb164a9efe..036a84cdd0b14f150560570c6104b8c543772169 100644 (file)
@@ -40,7 +40,7 @@ public:
     void addEnumSignature(unsigned id, ApiTraceEnumSignature *signature);
 
 
-    QList<ApiTraceCall*> calls() const;
+    QVector<ApiTraceCall*> calls() const;
     ApiTraceCall *callAt(int idx) const;
     ApiTraceCall *callWithIndex(int idx) const;
     int numCalls() const;
@@ -89,7 +89,7 @@ private:
     QString m_tempFileName;
 
     QList<ApiTraceFrame*> m_frames;
-    QList<ApiTraceCall*> m_calls;
+    QVector<ApiTraceCall*> m_calls;
 
     FrameMarker m_frameMarker;
 
index ea1b3e2785e1a4293f2f09fa3dd99cc79a37597e..bdf55919334b9a149ae8263b9eeee68b7ca7a4fa 100644 (file)
@@ -979,7 +979,7 @@ void ApiTraceFrame::addCall(ApiTraceCall *call)
     }
 }
 
-QList<ApiTraceCall*> ApiTraceFrame::calls() const
+QVector<ApiTraceCall*> ApiTraceFrame::calls() const
 {
     return m_calls;
 }
@@ -1003,3 +1003,10 @@ int ApiTraceFrame::binaryDataSize() const
 {
     return m_binaryDataSize;
 }
+
+void ApiTraceFrame::setCalls(const QVector<ApiTraceCall*> &calls,
+                             quint64 binaryDataSize)
+{
+    m_calls = calls;
+    m_binaryDataSize = binaryDataSize;
+}
index 9d67febcf3f76ed327037f9c4c37ee80d974c945..3da1d7d169f8630bfd979bd638ccdf41515c9af1 100644 (file)
@@ -297,13 +297,15 @@ public:
     int callIndex(ApiTraceCall *call) const;
     ApiTraceCall *call(int idx) const;
     void addCall(ApiTraceCall *call);
-    QList<ApiTraceCall*> calls() const;
+    QVector<ApiTraceCall*> calls() const;
+    void setCalls(const QVector<ApiTraceCall*> &calls,
+                  quint64 binaryDataSize);
 
     int binaryDataSize() const;
 private:
     ApiTrace *m_parentTrace;
     quint64 m_binaryDataSize;
-    QList<ApiTraceCall*> m_calls;
+    QVector<ApiTraceCall*> m_calls;
 };
 Q_DECLARE_METATYPE(ApiTraceFrame*);
 
index 054545333b37f5d7e7652d4103815581c4da80eb..f311fe0d3e33f52e19bfcc1c471d8666a809d953 100644 (file)
@@ -55,6 +55,8 @@ void LoaderThread::run()
     file.close();
 
     Trace::Parser p;
+    QVector<ApiTraceCall*> calls;
+    quint64 binaryDataSize = 0;
     if (p.open(m_fileName.toLatin1().constData())) {
         Trace::Call *call = p.parse_call();
         while (call) {
@@ -66,11 +68,20 @@ void LoaderThread::run()
             }
             ApiTraceCall *apiCall =
                 apiCallFromTraceCall(call, helpHash, currentFrame);
-            currentFrame->addCall(apiCall);
+            calls.append(apiCall);
+            if (apiCall->hasBinaryData()) {
+                QByteArray data =
+                    apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray();
+                binaryDataSize += data.size();
+            }
             if (ApiTrace::isCallAFrameMarker(apiCall,
                                              m_frameMarker)) {
+                calls.squeeze();
+                currentFrame->setCalls(calls, binaryDataSize);
+                calls.clear();
                 frames.append(currentFrame);
                 currentFrame = 0;
+                binaryDataSize = 0;
                 if (frames.count() >= FRAMES_TO_CACHE) {
                     emit parsedFrames(frames);
                     frames.clear();
index 5072db74000f032b10eb94141287df58e1267287..34e99f5e1b2a5e4906e0d296998db58a93b80439 100644 (file)
@@ -856,7 +856,7 @@ void MainWindow::slotSearchNext(const QString &str,
         m_searchWidget->setFound(false);
         return;
     }
-    const QList<ApiTraceCall*> &calls = m_trace->calls();
+    const QVector<ApiTraceCall*> &calls = m_trace->calls();
     int callNum = calls.indexOf(call);
 
     for (int i = callNum + 1; i < calls.count(); ++i) {
@@ -907,7 +907,7 @@ void MainWindow::slotSearchPrev(const QString &str,
         m_searchWidget->setFound(false);
         return;
     }
-    const QList<ApiTraceCall*> &calls = m_trace->calls();
+    const QVector<ApiTraceCall*> &calls = m_trace->calls();
     int callNum = calls.indexOf(call);
 
     for (int i = callNum - 1; i >= 0; --i) {
@@ -1002,8 +1002,8 @@ void MainWindow::slotGoFrameStart()
         return;
     }
 
-    QList<ApiTraceCall*>::const_iterator itr;
-    QList<ApiTraceCall*> calls = frame->calls();
+    QVector<ApiTraceCall*>::const_iterator itr;
+    QVector<ApiTraceCall*> calls = frame->calls();
 
     itr = calls.constBegin();
     while (itr != calls.constEnd()) {
@@ -1023,8 +1023,8 @@ void MainWindow::slotGoFrameEnd()
     if (!frame || frame->isEmpty()) {
         return;
     }
-    QList<ApiTraceCall*>::const_iterator itr;
-    QList<ApiTraceCall*> calls = frame->calls();
+    QVector<ApiTraceCall*>::const_iterator itr;
+    QVector<ApiTraceCall*> calls = frame->calls();
 
     itr = calls.constEnd();
     do {
index d7f6906c7e136b7653d18084d487522ebf764b86..5cf8818120e176b16690645a2776f5de1a5820a6 100644 (file)
@@ -210,7 +210,7 @@ SaverThread::SaverThread(QObject *parent)
 }
 
 void SaverThread::saveFile(const QString &fileName,
-                           const QList<ApiTraceCall*> &calls)
+                           const QVector<ApiTraceCall*> &calls)
 {
     m_fileName = fileName;
     m_calls = calls;
index 5bea5b7581fc8d07a3857da494ddeaa74e7dea08..3da502ce98df509b190893cd7b7df39d9f2fab7c 100644 (file)
@@ -4,7 +4,7 @@
 
 #include "apitrace.h"
 #include <QThread>
-#include <QList>
+#include <QVector>
 
 class ApiTraceCall;
 class ApiTraceFrame;
@@ -17,7 +17,7 @@ public:
 
 public slots:
     void saveFile(const QString &fileName,
-                  const QList<ApiTraceCall*> &calls);
+                  const QVector<ApiTraceCall*> &calls);
 
 signals:
     void traceSaved();
@@ -27,7 +27,7 @@ protected:
 
 private:
     QString m_fileName;
-    QList<ApiTraceCall*> m_calls;
+    QVector<ApiTraceCall*> m_calls;
 };