From ed09035b26dcd04a9f8c8b74e9ecdb72312c3714 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 6 Oct 2015 20:47:47 +0200 Subject: [PATCH] Be very careful about order of object destruction to avoid races --- renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index 31fdca71d..784b09a82 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -24,13 +24,17 @@ #include "../vk_core.h" +// note, for threading reasons we ensure to release the wrappers before +// releasing the underlying object. Otherwise after releasing the vulkan object +// that same handle could be returned by create on another thread, and we +// could end up trying to re-wrap it. #define DESTROY_IMPL(type, func) \ VkResult WrappedVulkan::vk ## func(VkDevice device, type obj) \ { \ if(m_ImageInfo.find(GetResID(obj)) != m_ImageInfo.end()) m_ImageInfo.erase(GetResID(obj)); \ - VkResult ret = ObjDisp(device)->func(Unwrap(device), Unwrap(obj)); \ + type unwrappedObj = Unwrap(obj); \ GetResourceManager()->ReleaseWrappedResource(obj, true); \ - return ret; \ + return ObjDisp(device)->func(Unwrap(device), unwrappedObj); \ } DESTROY_IMPL(VkBuffer, DestroyBuffer)