From 4775abfe1c4d0614cf06be02707b9f2f4eabbc2f Mon Sep 17 00:00:00 2001 From: Patrick Beaulieu Date: Thu, 15 Jun 2017 23:15:15 +0000 Subject: Fix context leak with internal kernels Account for internal program ctx references in cl_context_delete Signed-off-by: Patrick Beaulieu Reviewed-by: Yang Rong --- src/cl_context.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/cl_context.c b/src/cl_context.c index 4b8281c1..c5f36781 100644 --- a/src/cl_context.c +++ b/src/cl_context.c @@ -359,10 +359,28 @@ cl_context_delete(cl_context ctx) if (UNLIKELY(ctx == NULL)) return; + int internal_ctx_refs = 1; + // determine how many ctx refs are held by internal_prgs and built_in_prgs + for (i = CL_INTERNAL_KERNEL_MIN; i < CL_INTERNAL_KERNEL_MAX; i++) { + if (ctx->internal_kernels[i] && ctx->internal_prgs[i]) + ++internal_ctx_refs; + } + + if (ctx->built_in_prgs) + ++internal_ctx_refs; + + if (ctx->image_queue) + ++internal_ctx_refs; + /* We are not done yet */ - if (CL_OBJECT_DEC_REF(ctx) > 1) + if (CL_OBJECT_DEC_REF(ctx) > internal_ctx_refs) return; + // create a temporary extra ref here so cl_program_delete doesn't + // attempt a recursive full cl_context_delete when cleaning up + // our internal programs + CL_OBJECT_INC_REF(ctx); + if (ctx->image_queue) { clReleaseCommandQueue(ctx->image_queue); ctx->image_queue = NULL; @@ -388,6 +406,8 @@ cl_context_delete(cl_context ctx) cl_program_delete(ctx->built_in_prgs); ctx->built_in_prgs = NULL; + CL_OBJECT_DEC_REF(ctx); + cl_free(ctx->prop_user); cl_free(ctx->devices); cl_driver_delete(ctx->drv); -- cgit v1.2.3