glave: Fix search of mem_info list on UnmapMemory during tracing
authorJon Ashburn <jon@lunarg.com>
Fri, 20 Feb 2015 21:48:27 +0000 (14:48 -0700)
committerJon Ashburn <jon@lunarg.com>
Fri, 20 Feb 2015 22:16:00 +0000 (15:16 -0700)
glave-generate.py

index 75ad624..73ead36 100755 (executable)
@@ -332,7 +332,7 @@ class Subcommand(object):
         um_body.append('        entry->pData = NULL;')
         um_body.append('    } else')
         um_body.append('    {')
-        um_body.append('         glv_LogError("Failed to copy app memory into trace packet (idx = %u) on xglUnmapMemory\n", pHeader->global_packet_index);')
+        um_body.append('         glv_LogError("Failed to copy app memory into trace packet (idx = %u) on xglUnmapMemory\\n", pHeader->global_packet_index);')
         um_body.append('    }')
         um_body.append('    result = real_xglUnmapMemory(mem);')
         um_body.append('    pPacket->mem = mem;')
@@ -751,7 +751,7 @@ class Subcommand(object):
         hf_body.append('static void init_mem_info()')
         hf_body.append('{')
         hf_body.append('    g_memInfo.numEntrys = 0;')
-        hf_body.append('    g_memInfo.capacity = 1024;')
+        hf_body.append('    g_memInfo.capacity = 4096;')
         hf_body.append('    g_memInfo.pLastMapped = NULL;')
         hf_body.append('')
         hf_body.append('    g_memInfo.pEntrys = GLV_NEW_ARRAY(XGLAllocInfo, g_memInfo.capacity);')
@@ -779,28 +779,32 @@ class Subcommand(object):
         hf_body.append('    XGLAllocInfo *entry;')
         hf_body.append('    if (g_memInfo.numEntrys > g_memInfo.capacity)')
         hf_body.append('    {')
-        hf_body.append('        glv_LogError("get_mem_info_entry() bad internal state numEntrys\\n");')
+        hf_body.append('        glv_LogError("get_mem_info_entry() bad internal state numEntrys %u\\n", g_memInfo.numEntrys);')
         hf_body.append('        return NULL;')
         hf_body.append('    }')
         hf_body.append('')
+        hf_body.append('    entry = g_memInfo.pEntrys;')
+        hf_body.append('    for (i = 0; i < g_memInfo.numEntrys; i++)')
+        hf_body.append('    {')
+        hf_body.append('        if ((entry + i)->valid == FALSE)')
+        hf_body.append('            return entry + i;')
+        hf_body.append('    }')
         hf_body.append('    if (g_memInfo.numEntrys == g_memInfo.capacity)')
         hf_body.append('    {  // grow the array 2x')
         hf_body.append('        g_memInfo.capacity *= 2;')
         hf_body.append('        g_memInfo.pEntrys = (XGLAllocInfo *) GLV_REALLOC(g_memInfo.pEntrys, g_memInfo.capacity * sizeof(XGLAllocInfo));')
+        hf_body.append('        if (g_memInfo.pEntrys == NULL)')
+        hf_body.append('            glv_LogError("get_mem_info_entry() realloc failed\\n");')
+        hf_body.append('        //glv_LogInfo("realloc memInfo from %u to %u\\n", g_memInfo.capacity /2, g_memInfo.capacity);')
         hf_body.append('        //init the newly added entrys')
         hf_body.append('        init_mem_info_entrys(g_memInfo.pEntrys + g_memInfo.capacity / 2, g_memInfo.capacity / 2);')
         hf_body.append('    }')
         hf_body.append('')
         hf_body.append('    assert(g_memInfo.numEntrys < g_memInfo.capacity);')
-        hf_body.append('    entry = g_memInfo.pEntrys;')
-        hf_body.append('    for (i = 0; i < g_memInfo.capacity; i++)')
-        hf_body.append('    {')
-        hf_body.append('        if ((entry + i)->valid == FALSE)')
-        hf_body.append('            return entry + i;')
-        hf_body.append('    }')
-        hf_body.append('')
-        hf_body.append('    glv_LogError("get_mem_info_entry() did not find an entry\\n");')
-        hf_body.append('    return NULL;')
+        hf_body.append('    entry = g_memInfo.pEntrys + g_memInfo.numEntrys;')
+        hf_body.append('    g_memInfo.numEntrys++;')
+        hf_body.append('    assert(entry->valid == FALSE);')
+        hf_body.append('    return entry;')
         hf_body.append('}')
         hf_body.append('')
         hf_body.append('// caller must hold the g_memInfoLock')
@@ -848,7 +852,6 @@ class Subcommand(object):
         hf_body.append('        entry->handle = handle;')
         hf_body.append('        entry->size = size;')
         hf_body.append('        entry->pData = pData;   // NOTE: xglFreeMemory will free this mem, so no malloc()')
-        hf_body.append('        g_memInfo.numEntrys++;')
         hf_body.append('    }')
         hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
         hf_body.append('}')
@@ -880,7 +883,7 @@ class Subcommand(object):
         hf_body.append('        entry->size = 0;')
         hf_body.append('        entry->handle = NULL;')
         hf_body.append('')
-        hf_body.append('        g_memInfo.numEntrys--;')
+        hf_body.append('        //TODO go thru array and set numEntrys based on last valid entry g_memInfo.numEntrys--;')
         hf_body.append('        if (entry == g_memInfo.pLastMapped)')
         hf_body.append('            g_memInfo.pLastMapped = NULL;')
         hf_body.append('        if (g_memInfo.numEntrys == 0)')