layers: Fix thread-safety issues found in rendersystemtests
MemTracker and DrawState needed some mutex protection.
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 5ce9783..aebf932 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -1426,7 +1426,7 @@
static GLOBAL_CB_NODE* getCBNode(layer_data* my_data, const VkCommandBuffer cb)
{
loader_platform_thread_lock_mutex(&globalLock);
- if (my_data->commandBufferMap.find(cb) == my_data->commandBufferMap.end()) {
+ if (my_data->commandBufferMap.count(cb) == 0) {
loader_platform_thread_unlock_mutex(&globalLock);
// TODO : How to pass cb as srcObj here?
log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_INVALID_COMMAND_BUFFER, "DS",
@@ -1441,8 +1441,9 @@
// NOTE : Calls to this function should be wrapped in mutex
static void deleteCommandBuffers(layer_data* my_data)
{
- if (my_data->commandBufferMap.size() <= 0)
+ if (my_data->commandBufferMap.size() <= 0) {
return;
+ }
for (auto ii=my_data->commandBufferMap.begin(); ii!=my_data->commandBufferMap.end(); ++ii) {
vector<CMD_NODE*> cmd_node_list = (*ii).second->pCmds;
while (!cmd_node_list.empty()) {
@@ -2091,6 +2092,7 @@
for (auto i = 0; i < count; i++) {
// Delete CB information structure, and remove from commandBufferMap
auto cb = dev_data->commandBufferMap.find(pCommandBuffers[i]);
+ loader_platform_thread_lock_mutex(&globalLock);
if (cb != dev_data->commandBufferMap.end()) {
delete (*cb).second;
dev_data->commandBufferMap.erase(cb);
@@ -2098,6 +2100,7 @@
// Remove commandBuffer reference from commandPoolMap
dev_data->commandPoolMap[commandPool].remove(pCommandBuffers[i]);
+ loader_platform_thread_unlock_mutex(&globalLock);
}
dev_data->device_dispatch_table->FreeCommandBuffers(device, commandPool, count, pCommandBuffers);
@@ -2110,7 +2113,9 @@
VkResult result = dev_data->device_dispatch_table->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
if (VK_SUCCESS == result) {
+ loader_platform_thread_lock_mutex(&globalLock);
dev_data->commandPoolMap[*pCommandPool];
+ loader_platform_thread_unlock_mutex(&globalLock);
}
return result;
}
@@ -2118,6 +2123,7 @@
VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator)
{
layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
+ loader_platform_thread_lock_mutex(&globalLock);
// Must remove cmdpool from cmdpoolmap, after removing all cmdbuffers in its list from the commandPoolMap
if (dev_data->commandPoolMap.find(commandPool) != dev_data->commandPoolMap.end()) {
@@ -2129,6 +2135,8 @@
}
}
dev_data->commandPoolMap.erase(commandPool);
+
+ loader_platform_thread_unlock_mutex(&globalLock);
dev_data->device_dispatch_table->DestroyCommandPool(device, commandPool, pAllocator);
}
@@ -2519,12 +2527,13 @@
for (auto i = 0; i < pCreateInfo->bufferCount; i++) {
// Validate command pool
if (dev_data->commandPoolMap.find(pCreateInfo->commandPool) != dev_data->commandPoolMap.end()) {
+ loader_platform_thread_lock_mutex(&globalLock);
// Add command buffer to its commandPool map
dev_data->commandPoolMap[pCreateInfo->commandPool].push_back(pCommandBuffer[i]);
-
GLOBAL_CB_NODE* pCB = new GLOBAL_CB_NODE;
// Add command buffer to map
dev_data->commandBufferMap[pCommandBuffer[i]] = pCB;
+ loader_platform_thread_unlock_mutex(&globalLock);
resetCB(dev_data, pCommandBuffer[i]);
pCB->commandBuffer = pCommandBuffer[i];
pCB->createInfo = *pCreateInfo;