diff options
| author | Jon Ashburn <jon@lunarg.com> | 2015-02-19 17:04:06 -0700 |
|---|---|---|
| committer | Jon Ashburn <jon@lunarg.com> | 2015-02-20 15:15:59 -0700 |
| commit | 104a4e737e0544f9fa5888f8ee3a49a653b9dded (patch) | |
| tree | 621eb2c4accc3ddceea4243600ee958301ec7698 | |
| parent | bfbb706390507d2e1c30925fff98b1147680416d (diff) | |
| download | usermoji-104a4e737e0544f9fa5888f8ee3a49a653b9dded.tar.xz | |
glave: Lock around access to the global mem_info list
| -rwxr-xr-x | glave-generate.py | 102 |
1 files changed, 65 insertions, 37 deletions
diff --git a/glave-generate.py b/glave-generate.py index 2d3d9ed5..b47ccc55 100755 --- a/glave-generate.py +++ b/glave-generate.py @@ -296,14 +296,16 @@ class Subcommand(object): 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 @@ class Subcommand(object): 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 @@ class Subcommand(object): 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 @@ class Subcommand(object): 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 @@ class Subcommand(object): 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 @@ 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(' 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 @@ class Subcommand(object): 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)') |
