From afccdd58efe9bf938427aaaa519e4dd1d04d6f88 Mon Sep 17 00:00:00 2001 From: Patrick Beaulieu Date: Wed, 14 Jun 2017 10:53:51 -0700 Subject: [PATCH] Fix context leak with internal kernels Account for internal program ctx references in cl_context_delete --- src/cl_context.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/cl_context.c b/src/cl_context.c index 1ba23024..89362365 100644 --- a/src/cl_context.c +++ b/src/cl_context.c @@ -358,10 +358,25 @@ 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; + /* 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); + /* delete the internal programs. */ for (i = CL_INTERNAL_KERNEL_MIN; i < CL_INTERNAL_KERNEL_MAX; i++) { if (ctx->internal_kernels[i]) { @@ -382,6 +397,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); -- 2.11.0