avutil/hwcontext_vulkan: fix memleak when device_create is skipped

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
Zhao Zhili 2023-10-27 19:53:10 +08:00
parent 1a8e766984
commit bf1e5f2773
1 changed files with 14 additions and 3 deletions

View File

@ -1164,6 +1164,11 @@ static int setup_queue_families(AVHWDeviceContext *ctx, VkDeviceCreateInfo *cd)
return 0; return 0;
} }
/* Only resources created by vulkan_device_create should be released here,
* resources created by vulkan_device_init should be released by
* vulkan_device_uninit, to make sure we don't free user provided resources,
* and there is no leak.
*/
static void vulkan_device_free(AVHWDeviceContext *ctx) static void vulkan_device_free(AVHWDeviceContext *ctx)
{ {
VulkanDevicePriv *p = ctx->internal->priv; VulkanDevicePriv *p = ctx->internal->priv;
@ -1183,15 +1188,20 @@ static void vulkan_device_free(AVHWDeviceContext *ctx)
if (p->libvulkan) if (p->libvulkan)
dlclose(p->libvulkan); dlclose(p->libvulkan);
RELEASE_PROPS(hwctx->enabled_inst_extensions, hwctx->nb_enabled_inst_extensions);
RELEASE_PROPS(hwctx->enabled_dev_extensions, hwctx->nb_enabled_dev_extensions);
}
static void vulkan_device_uninit(AVHWDeviceContext *ctx)
{
VulkanDevicePriv *p = ctx->internal->priv;
for (uint32_t i = 0; i < p->nb_tot_qfs; i++) { for (uint32_t i = 0; i < p->nb_tot_qfs; i++) {
pthread_mutex_destroy(p->qf_mutex[i]); pthread_mutex_destroy(p->qf_mutex[i]);
av_freep(&p->qf_mutex[i]); av_freep(&p->qf_mutex[i]);
} }
av_freep(&p->qf_mutex); av_freep(&p->qf_mutex);
RELEASE_PROPS(hwctx->enabled_inst_extensions, hwctx->nb_enabled_inst_extensions);
RELEASE_PROPS(hwctx->enabled_dev_extensions, hwctx->nb_enabled_dev_extensions);
ff_vk_uninit(&p->vkctx); ff_vk_uninit(&p->vkctx);
} }
@ -3702,6 +3712,7 @@ const HWContextType ff_hwcontext_type_vulkan = {
.frames_priv_size = sizeof(VulkanFramesPriv), .frames_priv_size = sizeof(VulkanFramesPriv),
.device_init = &vulkan_device_init, .device_init = &vulkan_device_init,
.device_uninit = &vulkan_device_uninit,
.device_create = &vulkan_device_create, .device_create = &vulkan_device_create,
.device_derive = &vulkan_device_derive, .device_derive = &vulkan_device_derive,