glave: Lock around access to the global mem_info list
diff --git a/glave-generate.py b/glave-generate.py
index 2d3d9ed..b47ccc5 100755
--- a/glave-generate.py
+++ b/glave-generate.py
@@ -296,14 +296,16 @@
         init_tracer.append('    pPacket->version = XGL_API_VERSION;')
         init_tracer.append('    FINISH_TRACE_PACKET();\n}\n')
 
+        init_tracer.append('static GLV_CRITICAL_SECTION g_memInfoLock;')
         init_tracer.append('void InitTracer()\n{')
-        init_tracer.append('char *ipAddr = glv_get_global_var("GLVLIB_TRACE_IPADDR");')
-        init_tracer.append('if (ipAddr == NULL)')
-        init_tracer.append('    ipAddr = "127.0.0.1";')
+        init_tracer.append('    char *ipAddr = glv_get_global_var("GLVLIB_TRACE_IPADDR");')
+        init_tracer.append('    if (ipAddr == NULL)')
+        init_tracer.append('        ipAddr = "127.0.0.1";')
         init_tracer.append('    gMessageStream = glv_MessageStream_create(FALSE, ipAddr, GLV_BASE_PORT + GLV_TID_XGL);')
         init_tracer.append('    glv_trace_set_trace_file(glv_FileLike_create_msg(gMessageStream));')
         init_tracer.append('//    glv_tracelog_set_log_file(glv_FileLike_create_file(fopen("glv_log_traceside.txt","w")));')
         init_tracer.append('    glv_tracelog_set_tracer_id(GLV_TID_XGL);')
+        init_tracer.append('    glv_create_critical_section(&g_memInfoLock);')
         init_tracer.append('    send_xgl_api_version_packet();\n}\n')
         return "\n".join(init_tracer)
 
@@ -319,7 +321,7 @@
         um_body.append('    SEND_ENTRYPOINT_PARAMS("xglUnmapMemory(mem %p)\\n", mem);')
         um_body.append('    // insert into packet the data that was written by CPU between the xglMapMemory call and here')
         um_body.append('    // Note must do this prior to the real xglUnMap() or else may get a FAULT')
-        um_body.append('    entry = find_mem_info_entry(mem);')
+        um_body.append('    entry = find_mem_info_entry_lock(mem);')
         um_body.append('    CREATE_TRACE_PACKET(xglUnmapMemory, (entry) ? entry->size : 0);')
         um_body.append('    pPacket = interpret_body_as_xglUnmapMemory(pHeader);')
         um_body.append('    if (entry)')
@@ -727,7 +729,7 @@
         hf_body.append('    unsigned int capacity;')
         hf_body.append('} XGLMemInfo;')
         hf_body.append('')
-        hf_body.append('static XGLMemInfo mInfo = {0, NULL, NULL, 0};')
+        hf_body.append('static XGLMemInfo g_memInfo = {0, NULL, NULL, 0};')
         hf_body.append('')
         hf_body.append('static void init_mem_info_entrys(XGLAllocInfo *ptr, const unsigned int num)')
         hf_body.append('{')
@@ -742,50 +744,53 @@
         hf_body.append('    }')
         hf_body.append('}')
         hf_body.append('')
+        hf_body.append('// caller must hold the g_memInfoLock')
         hf_body.append('static void init_mem_info()')
         hf_body.append('{')
-        hf_body.append('    mInfo.numEntrys = 0;')
-        hf_body.append('    mInfo.capacity = 1024;')
-        hf_body.append('    mInfo.pLastMapped = NULL;')
+        hf_body.append('    g_memInfo.numEntrys = 0;')
+        hf_body.append('    g_memInfo.capacity = 1024;')
+        hf_body.append('    g_memInfo.pLastMapped = NULL;')
         hf_body.append('')
-        hf_body.append('    mInfo.pEntrys = GLV_NEW_ARRAY(XGLAllocInfo, mInfo.capacity);')
+        hf_body.append('    g_memInfo.pEntrys = GLV_NEW_ARRAY(XGLAllocInfo, g_memInfo.capacity);')
         hf_body.append('')
-        hf_body.append('    if (mInfo.pEntrys == NULL)')
+        hf_body.append('    if (g_memInfo.pEntrys == NULL)')
         hf_body.append('        glv_LogError("init_mem_info()  malloc failed\\n");')
         hf_body.append('    else')
-        hf_body.append('        init_mem_info_entrys(mInfo.pEntrys, mInfo.capacity);')
+        hf_body.append('        init_mem_info_entrys(g_memInfo.pEntrys, g_memInfo.capacity);')
         hf_body.append('}')
         hf_body.append('')
+        hf_body.append('// caller must hold the g_memInfoLock')
         hf_body.append('static void delete_mem_info()')
         hf_body.append('{')
-        hf_body.append('    GLV_DELETE(mInfo.pEntrys);')
-        hf_body.append('    mInfo.pEntrys = NULL;')
-        hf_body.append('    mInfo.numEntrys = 0;')
-        hf_body.append('    mInfo.capacity = 0;')
-        hf_body.append('    mInfo.pLastMapped = NULL;')
+        hf_body.append('    GLV_DELETE(g_memInfo.pEntrys);')
+        hf_body.append('    g_memInfo.pEntrys = NULL;')
+        hf_body.append('    g_memInfo.numEntrys = 0;')
+        hf_body.append('    g_memInfo.capacity = 0;')
+        hf_body.append('    g_memInfo.pLastMapped = NULL;')
         hf_body.append('}')
         hf_body.append('')
+        hf_body.append('// caller must hold the g_memInfoLock')
         hf_body.append('static XGLAllocInfo * get_mem_info_entry()')
         hf_body.append('{')
         hf_body.append('    unsigned int i;')
         hf_body.append('    XGLAllocInfo *entry;')
-        hf_body.append('    if (mInfo.numEntrys > mInfo.capacity)')
+        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('        return NULL;')
         hf_body.append('    }')
         hf_body.append('')
-        hf_body.append('    if (mInfo.numEntrys == mInfo.capacity)')
+        hf_body.append('    if (g_memInfo.numEntrys == g_memInfo.capacity)')
         hf_body.append('    {  // grow the array 2x')
-        hf_body.append('        mInfo.capacity *= 2;')
-        hf_body.append('        mInfo.pEntrys = (XGLAllocInfo *) GLV_REALLOC(mInfo.pEntrys, mInfo.capacity * sizeof(XGLAllocInfo));')
+        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('        //init the newly added entrys')
-        hf_body.append('        init_mem_info_entrys(mInfo.pEntrys + mInfo.capacity / 2, mInfo.capacity / 2);')
+        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(mInfo.numEntrys < mInfo.capacity);')
-        hf_body.append('    entry = mInfo.pEntrys;')
-        hf_body.append('    for (i = 0; i < mInfo.capacity; i++)')
+        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;')
@@ -795,26 +800,42 @@
         hf_body.append('    return NULL;')
         hf_body.append('}')
         hf_body.append('')
+        hf_body.append('// caller must hold the g_memInfoLock')
         hf_body.append('static XGLAllocInfo * find_mem_info_entry(const XGL_GPU_MEMORY handle)')
         hf_body.append('{')
-        hf_body.append('    XGLAllocInfo *entry = mInfo.pEntrys;')
+        hf_body.append('    XGLAllocInfo *entry;')
         hf_body.append('    unsigned int i;')
-        hf_body.append('    if (mInfo.pLastMapped && mInfo.pLastMapped->handle == handle && mInfo.pLastMapped->valid)')
-        hf_body.append('        return mInfo.pLastMapped;')
-        hf_body.append('    for (i = 0; i < mInfo.numEntrys; i++)')
+        hf_body.append('    entry = g_memInfo.pEntrys;')
+        hf_body.append('    if (g_memInfo.pLastMapped && g_memInfo.pLastMapped->handle == handle && g_memInfo.pLastMapped->valid)')
+        hf_body.append('    {')
+        hf_body.append('        return g_memInfo.pLastMapped;')
+        hf_body.append('    }')
+        hf_body.append('    for (i = 0; i < g_memInfo.numEntrys; i++)')
         hf_body.append('    {')
         hf_body.append('        if ((entry + i)->valid && (handle == (entry + i)->handle))')
+        hf_body.append('        {')
         hf_body.append('            return entry + i;')
+        hf_body.append('        }')
         hf_body.append('    }')
         hf_body.append('')
         hf_body.append('    return NULL;')
         hf_body.append('}')
         hf_body.append('')
+        hf_body.append('static XGLAllocInfo * find_mem_info_entry_lock(const XGL_GPU_MEMORY handle)')
+        hf_body.append('{')
+        hf_body.append('    XGLAllocInfo *res;')
+        hf_body.append('    glv_enter_critical_section(&g_memInfoLock);')
+        hf_body.append('    res = find_mem_info_entry(handle);')
+        hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
+        hf_body.append('    return res;')
+        hf_body.append('}')
+        hf_body.append('')
         hf_body.append('static void add_new_handle_to_mem_info(const XGL_GPU_MEMORY handle, XGL_GPU_SIZE size, void *pData)')
         hf_body.append('{')
         hf_body.append('    XGLAllocInfo *entry;')
         hf_body.append('')
-        hf_body.append('    if (mInfo.capacity == 0)')
+        hf_body.append('    glv_enter_critical_section(&g_memInfoLock);')
+        hf_body.append('    if (g_memInfo.capacity == 0)')
         hf_body.append('        init_mem_info();')
         hf_body.append('')
         hf_body.append('    entry = get_mem_info_entry();')
@@ -824,25 +845,31 @@
         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('        mInfo.numEntrys++;')
+        hf_body.append('        g_memInfo.numEntrys++;')
         hf_body.append('    }')
+        hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
         hf_body.append('}')
         hf_body.append('')
         hf_body.append('static void add_data_to_mem_info(const XGL_GPU_MEMORY handle, void *pData)')
         hf_body.append('{')
-        hf_body.append('    XGLAllocInfo *entry = find_mem_info_entry(handle);')
+        hf_body.append('    XGLAllocInfo *entry;')
         hf_body.append('')
+        hf_body.append('    glv_enter_critical_section(&g_memInfoLock);')
+        hf_body.append('    entry = find_mem_info_entry(handle);')
         hf_body.append('    if (entry)')
         hf_body.append('    {')
         hf_body.append('        entry->pData = pData;')
         hf_body.append('    }')
-        hf_body.append('    mInfo.pLastMapped = entry;')
+        hf_body.append('    g_memInfo.pLastMapped = entry;')
+        hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
         hf_body.append('}')
         hf_body.append('')
         hf_body.append('static void rm_handle_from_mem_info(const XGL_GPU_MEMORY handle)')
         hf_body.append('{')
-        hf_body.append('    XGLAllocInfo *entry = find_mem_info_entry(handle);')
+        hf_body.append('    XGLAllocInfo *entry;')
         hf_body.append('')
+        hf_body.append('    glv_enter_critical_section(&g_memInfoLock);')
+        hf_body.append('    entry = find_mem_info_entry(handle);')
         hf_body.append('    if (entry)')
         hf_body.append('    {')
         hf_body.append('        entry->valid = FALSE;')
@@ -850,12 +877,13 @@
         hf_body.append('        entry->size = 0;')
         hf_body.append('        entry->handle = NULL;')
         hf_body.append('')
-        hf_body.append('        mInfo.numEntrys--;')
-        hf_body.append('        if (entry == mInfo.pLastMapped)')
-        hf_body.append('            mInfo.pLastMapped = NULL;')
-        hf_body.append('        if (mInfo.numEntrys == 0)')
+        hf_body.append('        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)')
         hf_body.append('            delete_mem_info();')
         hf_body.append('    }')
+        hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
         hf_body.append('}')
         hf_body.append('')
         hf_body.append('static void add_begin_cmdbuf_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')