]> git.cworth.org Git - apitrace/blobdiff - gui/loaderthread.cpp
Encapsulate on parser state in structure.
[apitrace] / gui / loaderthread.cpp
index 054545333b37f5d7e7652d4103815581c4da80eb..03f0ccd0f68569983d7bc9b0ca362bae23ab8f70 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();
@@ -84,6 +95,10 @@ void LoaderThread::run()
     //  it's just a bunch of Delete calls for every object
     //  after the last SwapBuffers
     if (currentFrame) {
+        if (!frames.count()) {
+            calls.squeeze();
+            currentFrame->setCalls(calls, binaryDataSize);
+        }
         frames.append(currentFrame);
         currentFrame = 0;
     }