aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobin@lunarg.com>2015-02-23 14:09:16 -0700
committerTobin Ehlis <tobin@lunarg.com>2015-02-23 16:11:38 -0700
commitcfe875fc793205405c28f9bf19178e388ab158f3 (patch)
tree328011c1b142d7d1e471ccae543843c5a945652d
parent82014fd746c12815d262260d959a5f6276ad55cc (diff)
downloadusermoji-cfe875fc793205405c28f9bf19178e388ab158f3.tar.xz
layers: Lock ObjectTracker linked-list access
-rwxr-xr-xxgl-layer-generate.py33
1 files changed, 26 insertions, 7 deletions
diff --git a/xgl-layer-generate.py b/xgl-layer-generate.py
index c1b1091e..f86109c6 100755
--- a/xgl-layer-generate.py
+++ b/xgl-layer-generate.py
@@ -598,7 +598,9 @@ class Subcommand(object):
elif True in [no_use_proto in proto.name for no_use_proto in ['GlobalOption', 'CreateInstance']]:
using_line = ''
else:
- using_line = ' ll_increment_use_count((void*)%s, %s);\n' % (param0_name, obj_type_mapping[p0_type])
+ using_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
+ using_line += ' ll_increment_use_count((void*)%s, %s);\n' % (param0_name, obj_type_mapping[p0_type])
+ using_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
if 'QueueSubmit' in proto.name:
using_line += ' set_status((void*)fence, XGL_OBJECT_TYPE_FENCE, OBJSTATUS_FENCE_IS_SUBMITTED);\n'
using_line += ' validate_memory_mapping_status(pMemRefs, memRefCount);\n'
@@ -621,16 +623,24 @@ class Subcommand(object):
using_line += ' reset_status((void*)mem, XGL_OBJECT_TYPE_GPU_MEMORY, OBJSTATUS_GPU_MEM_MAPPED);\n'
if 'AllocDescriptor' in proto.name: # Allocates array of DSs
create_line = ' for (uint32_t i = 0; i < *pCount; i++) {\n'
+ create_line += ' loader_platform_thread_lock_mutex(&objLock);\n'
create_line += ' ll_insert_obj((void*)pDescriptorSets[i], XGL_OBJECT_TYPE_DESCRIPTOR_SET);\n'
+ create_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
create_line += ' }\n'
elif 'Create' in proto.name or 'Alloc' in proto.name:
- create_line = ' ll_insert_obj((void*)*%s, %s);\n' % (proto.params[-1].name, obj_type_mapping[proto.params[-1].ty.strip('*').strip('const ')])
+ create_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
+ create_line += ' ll_insert_obj((void*)*%s, %s);\n' % (proto.params[-1].name, obj_type_mapping[proto.params[-1].ty.strip('*').strip('const ')])
+ create_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
if 'DestroyObject' in proto.name:
- destroy_line = ' ll_destroy_obj((void*)%s);\n' % (param0_name)
+ destroy_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
+ destroy_line += ' ll_destroy_obj((void*)%s);\n' % (param0_name)
+ destroy_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
using_line = ''
else:
if 'Destroy' in proto.name or 'Free' in proto.name:
- destroy_line = ' ll_remove_obj_type((void*)%s, %s);\n' % (param0_name, obj_type_mapping[p0_type])
+ destroy_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
+ destroy_line += ' ll_remove_obj_type((void*)%s, %s);\n' % (param0_name, obj_type_mapping[p0_type])
+ destroy_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
using_line = ''
if 'DestroyDevice' in proto.name:
destroy_line += ' // Report any remaining objects in LL\n objNode *pTrav = pGlobalHead;\n while (pTrav) {\n'
@@ -867,7 +877,7 @@ class Subcommand(object):
"}\n")
return "\n".join(func_body)
- def _generate_layer_initialization(self, name, init_opts=False, prefix='xgl'):
+ def _generate_layer_initialization(self, name, init_opts=False, prefix='xgl', lockname=None):
func_body = ["#include \"xgl_dispatch_table_helper.h\""]
func_body.append('static void init%s(void)\n'
'{\n' % name)
@@ -898,6 +908,13 @@ class Subcommand(object):
' assert(fpNextGPA);\n')
func_body.append(" layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);")
+ if lockname is not None:
+ func_body.append(" if (!%sLockInitialized)" % lockname)
+ func_body.append(" {")
+ func_body.append(" // TODO/TBD: Need to delete this mutex sometime. How???")
+ func_body.append(" loader_platform_thread_create_mutex(&%sLock);" % lockname)
+ func_body.append(" %sLockInitialized = 1;" % lockname)
+ func_body.append(" }")
func_body.append("}\n")
return "\n".join(func_body)
@@ -1151,6 +1168,8 @@ class ObjectTrackerSubcommand(Subcommand):
header_txt.append('#include "layers_msg.h"')
header_txt.append('static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(tabOnce);')
header_txt.append('static long long unsigned int object_track_index = 0;')
+ header_txt.append('static int objLockInitialized = 0;')
+ header_txt.append('static loader_platform_thread_mutex objLock;')
header_txt.append('')
header_txt.append('// We maintain a "Global" list which links every object and a')
header_txt.append('// per-Object list which just links objects of a given type')
@@ -1289,12 +1308,12 @@ class ObjectTrackerSubcommand(Subcommand):
header_txt.append(' // update HEAD of global list if needed')
header_txt.append(' if (pGlobalHead == pTrav)')
header_txt.append(' pGlobalHead = pTrav->pNextGlobal;')
- header_txt.append(' free(pTrav);')
header_txt.append(' assert(numTotalObjs > 0);')
header_txt.append(' numTotalObjs--;')
header_txt.append(' char str[1024];')
header_txt.append(' sprintf(str, "OBJ_STAT Removed %s obj %p that was used %lu times (%lu total objs & %lu %s objs).", string_XGL_OBJECT_TYPE(pTrav->obj.objType), pTrav->obj.pObj, pTrav->obj.numUses, numTotalObjs, numObjs[pTrav->obj.objType], string_XGL_OBJECT_TYPE(pTrav->obj.objType));')
header_txt.append(' layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pObj, 0, OBJTRACK_NONE, "OBJTRACK", str);')
+ header_txt.append(' free(pTrav);')
header_txt.append(' return;')
header_txt.append(' }')
header_txt.append(' pPrev = pTrav;')
@@ -1418,7 +1437,7 @@ class ObjectTrackerSubcommand(Subcommand):
return "\n".join(header_txt)
def generate_body(self):
- body = [self._generate_layer_initialization("ObjectTracker", True),
+ body = [self._generate_layer_initialization("ObjectTracker", True, lockname='obj'),
self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "ObjectTracker"),
self._generate_extensions(),
self._generate_layer_gpa_function("ObjectTracker", extensions=['objTrackGetObjectCount', 'objTrackGetObjects'])]