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)')