]> git.cworth.org Git - vogl/commitdiff
UI: Fix unnecessary memory overhead when loading traces.
authorPeter Lohrmann <plohrmann@upsamplesoftware.com>
Fri, 14 Mar 2014 20:43:22 +0000 (13:43 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 1 Apr 2014 19:37:28 +0000 (12:37 -0700)
* A vogl_trace_packet can have lots of memory associated with it, so they should not be copied or assigned if it can be avoided. In this case, the loading was using a single trace packet instance to load the data from disk, then the packet was being copied into its associated node in the API call tree. This assignment / copy was temporarily (and unnecessarily) doubling the size of the packet, requiring extra memory allocations, and generally just causing excessive overhead. Instead, allocate a separate vogl_trace_packet for each packet that needs to be loaded from disk, and pass that memory off the apiCallItem for management. This greatly improves load times and allows us to load traces that would previously fail due to memory limitations.
* Also move a few allocations over to using vogl_new and vogl_delete so that vogl can track the memory usage.

(cherry picked from commit 1bcaf8bd911c1b1604e59898c752506be1394c38)

src/vogleditor/vogleditor_apicallitem.h
src/vogleditor/vogleditor_frameitem.h
src/vogleditor/vogleditor_qapicalltreemodel.cpp

index f2155c9491a51a6499dff30fcaa547431a80ab68..5e9f46ce5aa068f7229415aa30ecdeb9feabf542 100644 (file)
@@ -40,10 +40,10 @@ class vogleditor_frameItem;
 class vogleditor_apiCallItem : public vogleditor_snapshotItem
 {
 public:
-   vogleditor_apiCallItem(vogleditor_frameItem* pFrame, vogl_trace_packet& tracePacket, const vogl_trace_gl_entrypoint_packet& glPacket)
+   vogleditor_apiCallItem(vogleditor_frameItem* pFrame, vogl_trace_packet* pTracePacket, const vogl_trace_gl_entrypoint_packet& glPacket)
        : m_pParentFrame(pFrame),
         m_glPacket(glPacket),
-        m_tracePacket(tracePacket),
+        m_pTracePacket(pTracePacket),
         m_globalCallIndex(glPacket.m_call_counter),
         m_begin_rdtsc(glPacket.m_packet_begin_rdtsc),
         m_end_rdtsc(glPacket.m_packet_end_rdtsc),
@@ -57,6 +57,11 @@ public:
 
    ~vogleditor_apiCallItem()
    {
+       if (m_pTracePacket != NULL)
+       {
+           vogl_delete(m_pTracePacket);
+           m_pTracePacket = NULL;
+       }
    }
 
    inline vogleditor_frameItem* frame() const
@@ -91,7 +96,7 @@ public:
 
    vogl_trace_packet* getTracePacket()
    {
-      return &m_tracePacket;
+      return m_pTracePacket;
    }
 
    inline uint64_t backtraceHashIndex() const
@@ -102,7 +107,7 @@ public:
 private:
    vogleditor_frameItem* m_pParentFrame;
    const vogl_trace_gl_entrypoint_packet m_glPacket;
-   vogl_trace_packet m_tracePacket;
+   vogl_trace_packet* m_pTracePacket;
 
    uint64_t m_globalCallIndex;
    uint64_t m_begin_rdtsc;
index f0604b53630ae16d0bf63485acc1a3f372e538fa..c35b400f85d25f7ad41e68bd8964557d39979975 100644 (file)
@@ -47,7 +47,7 @@ public:
    {
       for (int i = 0; i < m_apiCallList.size(); i++)
       {
-         delete m_apiCallList[i];
+         vogl_delete(m_apiCallList[i]);
          m_apiCallList[i] = NULL;
       }
       m_apiCallList.clear();
index 28e7e380aa99d070f8fbac34b89a980e5bb8e958..e34cc5b531611290f6f33ca173cc4c298d9600ee 100644 (file)
@@ -72,8 +72,6 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
 
    m_trace_ctypes.init(pTrace_reader->get_sof_packet().m_pointer_sizes);
 
-   vogl_trace_packet trace_packet(&m_trace_ctypes);
-
    for ( ; ; )
    {
       vogl_trace_file_reader::trace_file_reader_status_t read_status = pTrace_reader->read_next_packet();
@@ -97,7 +95,9 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
 
       if (pTrace_reader->get_packet_type() == cTSPTGLEntrypoint)
       {
-         if (!trace_packet.deserialize(pTrace_reader->get_packet_buf().get_ptr(), pTrace_reader->get_packet_buf().size(), false))
+         vogl_trace_packet* pTrace_packet = vogl_new(vogl_trace_packet, &m_trace_ctypes);
+
+         if (!pTrace_packet->deserialize(pTrace_reader->get_packet_buf().get_ptr(), pTrace_reader->get_packet_buf().size(), false))
          {
             console::error("%s: Failed parsing GL entrypoint packet\n", VOGL_FUNCTION_NAME);
             break;
@@ -111,12 +111,12 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
             // Check if this is a state snapshot.
             // This is entirely optional since the client is designed to dynamically get new snapshots
             // if they don't exist.
-            GLuint cmd = trace_packet.get_param_value<GLuint>(0);
-            GLuint size = trace_packet.get_param_value<GLuint>(1); VOGL_NOTE_UNUSED(size);
+            GLuint cmd = pTrace_packet->get_param_value<GLuint>(0);
+            GLuint size = pTrace_packet->get_param_value<GLuint>(1); VOGL_NOTE_UNUSED(size);
 
             if (cmd == cITCRKeyValueMap)
             {
-               key_value_map &kvm = trace_packet.get_key_value_map();
+               key_value_map &kvm = pTrace_packet->get_key_value_map();
 
                dynamic_string cmd_type(kvm.get_string("command_type"));
                if (cmd_type == "state_snapshot")
@@ -172,23 +172,23 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
          // format parameters
          funcCall.append("( ");
          dynamic_string paramStr;
-         for (uint param_index = 0; param_index < trace_packet.total_params(); param_index++)
+         for (uint param_index = 0; param_index < pTrace_packet->total_params(); param_index++)
          {
             if (param_index != 0)
                funcCall.append(", ");
 
             paramStr.clear();
-            trace_packet.pretty_print_param(paramStr, param_index, false);
+            pTrace_packet->pretty_print_param(paramStr, param_index, false);
 
             funcCall.append(paramStr.c_str());
          }
          funcCall.append(" )");
 
-         if (trace_packet.has_return_value())
+         if (pTrace_packet->has_return_value())
          {
             funcCall.append(" = ");
             paramStr.clear();
-            trace_packet.pretty_print_return_value(paramStr, false);
+            pTrace_packet->pretty_print_return_value(paramStr, false);
             funcCall.append(paramStr.c_str());
          }
 
@@ -197,7 +197,7 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
          if (pCurFrame == NULL)
          {
             pCurFrame = new vogleditor_frameItem(total_swaps);
-            vogleditor_apiCallTreeItem* pNewFrameNode = new vogleditor_apiCallTreeItem(pCurFrame, pCurParent);
+            vogleditor_apiCallTreeItem* pNewFrameNode = vogl_new(vogleditor_apiCallTreeItem, pCurFrame, pCurParent);
             pCurParent->appendChild(pNewFrameNode);
             m_itemList.append(pNewFrameNode);
 
@@ -212,7 +212,7 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
          }
 
          // make item and node for the api call
-         vogleditor_apiCallItem* pCallItem = new vogleditor_apiCallItem(pCurFrame, trace_packet, *pGL_packet);
+         vogleditor_apiCallItem* pCallItem = vogl_new(vogleditor_apiCallItem, pCurFrame, pTrace_packet, *pGL_packet);
          pCurFrame->appendCall(pCallItem);
 
          if (pPendingSnapshot != NULL)
@@ -221,7 +221,7 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
             pPendingSnapshot = NULL;
          }
 
-         vogleditor_apiCallTreeItem* item = new vogleditor_apiCallTreeItem(funcCall, pCallItem, pCurParent);
+         vogleditor_apiCallTreeItem* item = vogl_new(vogleditor_apiCallTreeItem, funcCall, pCallItem, pCurParent);
          pCurParent->appendChild(item);
          m_itemList.append(item);