aboutsummaryrefslogtreecommitdiff
path: root/layers/object_tracker.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2016-07-13 11:29:00 -0600
committerMark Lobodzinski <mark@lunarg.com>2016-07-22 11:32:26 -0600
commitc8c6ed9e02d6ce74c05bac1ebd2437b3ad5c5ab9 (patch)
treef3cc9513fd57b1011dc10b02326ff6e015d42af8 /layers/object_tracker.cpp
parent4d8dde0dea50100cf2fabd85b7f1c2d2d95311eb (diff)
downloadusermoji-c8c6ed9e02d6ce74c05bac1ebd2437b3ad5c5ab9.tar.xz
layers: Fix thread-safety fails in OT FreeXxx APIs
Tracking data was cleaned up after calling down the chain in FreeCommandBuffers and FreeDescriptorSets -- this left a hole that another thread could walk through and corrupt the tracking data. Change-Id: I7cc9c9bfae9f1ea179122125dd09952650f14d81
Diffstat (limited to 'layers/object_tracker.cpp')
-rw-r--r--layers/object_tracker.cpp18
1 files changed, 8 insertions, 10 deletions
diff --git a/layers/object_tracker.cpp b/layers/object_tracker.cpp
index 16140d66..7f49f561 100644
--- a/layers/object_tracker.cpp
+++ b/layers/object_tracker.cpp
@@ -3367,16 +3367,15 @@ VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool com
skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
}
+ for (uint32_t i = 0; i < commandBufferCount; i++) {
+ DestroyDispatchableObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT);
+ }
+
lock.unlock();
if (!skip_call) {
get_dispatch_table(ot_device_table_map, device)
->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
}
-
- lock.lock();
- for (uint32_t i = 0; i < commandBufferCount; i++) {
- DestroyDispatchableObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT);
- }
}
VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
@@ -3411,16 +3410,15 @@ VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorP
skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
}
+ for (uint32_t i = 0; i < descriptorSetCount; i++) {
+ DestroyNonDispatchableObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
+ }
+
lock.unlock();
if (!skip_call) {
result = get_dispatch_table(ot_device_table_map, device)
->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
}
-
- lock.lock();
- for (uint32_t i = 0; i < descriptorSetCount; i++) {
- DestroyNonDispatchableObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
- }
return result;
}