layers: Fix Memtracker fence-related memory leak
authorMark Lobodzinski <mark@lunarg.com>
Thu, 26 Feb 2015 00:11:05 +0000 (18:11 -0600)
committerMark Lobodzinski <mark@lunarg.com>
Thu, 26 Feb 2015 02:22:06 +0000 (20:22 -0600)
MemTracker created internal fence objects to locally track command buffer
completion, but these objects were never destroyed.

layers/mem_tracker.c
layers/mem_tracker.h

index 44e6e27..aaf30df 100644 (file)
@@ -120,7 +120,7 @@ static GLOBAL_CB_NODE* getGlobalCBNode(const XGL_CMD_BUFFER cb)
     return pTrav;
 }
 // Set fence for given cb in global cb node
-static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence)
+static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence, bool32_t localFlag)
 {
     GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
     if (!pTrav) {
@@ -130,6 +130,7 @@ static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence)
         return XGL_FALSE;
     }
     pTrav->fence = fence;
+    pTrav->localFlag = localFlag;
     return XGL_TRUE;
 }
 
@@ -284,6 +285,11 @@ static bool32_t freeCBBindings(const XGL_CMD_BUFFER cb)
         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
         return XGL_FALSE;
     }
+    if ((pCBTrav->fence != NULL) && (pCBTrav->localFlag == XGL_TRUE)) {
+        nextTable.DestroyObject(pCBTrav->fence);
+        pCBTrav->fence = NULL;
+        pCBTrav->localFlag = XGL_FALSE;
+    }
     MINI_NODE* pMemTrav = pCBTrav->pMemObjList;
     MINI_NODE* pDeleteMe = NULL;
     // We traverse LL in order and free nodes as they're cleared
@@ -853,10 +859,12 @@ XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEU
 
 XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
 {
+    bool32_t localFlag = XGL_FALSE;
     // TODO : Need to track fence and clear mem references when fence clears
     XGL_FENCE localFence = fence;
     if (XGL_NULL_HANDLE == fence) { // allocate our own fence to track cmd buffer
         localFence = createLocalFence();
+        localFlag = XGL_TRUE;
     }
     char str[1024];
     sprintf(str, "In xglQueueSubmit(), checking %u cmdBuffers with %u memRefs", cmdBufferCount, memRefCount);
@@ -864,7 +872,7 @@ XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdB
     printMemList();
     printGlobalCB();
     for (uint32_t i = 0; i < cmdBufferCount; i++) {
-        setCBFence(pCmdBuffers[i], localFence);
+        setCBFence(pCmdBuffers[i], localFence, localFlag);
         sprintf(str, "Verifying mem refs for CB %p", pCmdBuffers[i]);
         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
         if (XGL_FALSE == validateCBMemRef(pCmdBuffers[i], memRefCount, pMemRefs)) {
index 5e26147..930d972 100644 (file)
@@ -149,5 +149,6 @@ typedef struct _GLOBAL_CB_NODE {
     uint32_t                        colorAttachmentCount;
     XGL_DEPTH_STENCIL_BIND_INFO     dsBindInfo;
     XGL_CMD_BUFFER cmdBuffer;
-    XGL_FENCE fence; // fence tracking this cmd buffer
+    XGL_FENCE fence;                // fence tracking this cmd buffer
+    bool32_t localFlag;             // fence is internal to layer
 } GLOBAL_CB_NODE;