[Beignet] [PATCH] Fix context leak with internal kernels

Patrick Beaulieu patrick.beaulieu at avigilon.com
Thu Jun 15 23:15:15 UTC 2017


Account for internal program ctx references in cl_context_delete

Signed-off-by: Patrick Beaulieu <patrick.beaulieu at avigilon.com>
---
 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



More information about the Beignet mailing list