summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Rong <rong.r.yang@intel.com>2016-06-21 00:15:29 +0800
committerYang Rong <rong.r.yang@intel.com>2016-06-23 15:46:00 +0800
commitc2fb13ddc52141222391ea69371a21c83d2b5e18 (patch)
tree64b8ca62dd4cd6027c8a45680280d0ea06ab3a0e
parentc67f92f649c6dbf7ddd3bf99a6dcc05e619cff61 (diff)
downloadbeignet-c2fb13ddc52141222391ea69371a21c83d2b5e18.tar.gz
Runtime: fix caffe segmentation fault when exit.
For static object release, such as context, program, may called after delete static variable gbeLoader, so when in gbeLoader's destructor function, set the release relative functions to NULL, and when call these functions, add a check. This patch could fix caffe's segmentation fault when exit Signed-off-by: Yang Rong <rong.r.yang@intel.com> Reviewed-by: Ruiling Song <ruiling.song@intel.com>
-rw-r--r--src/cl_gbe_loader.cpp5
-rw-r--r--src/cl_program.c8
2 files changed, 11 insertions, 2 deletions
diff --git a/src/cl_gbe_loader.cpp b/src/cl_gbe_loader.cpp
index 2c7ef1ee..aa13a3d6 100644
--- a/src/cl_gbe_loader.cpp
+++ b/src/cl_gbe_loader.cpp
@@ -320,6 +320,11 @@ struct GbeLoaderInitializer
if (dlhInterp != NULL)
dlclose(dlhInterp);
+
+ //When destroy, set the release relative functions
+ //to NULL to avoid dangling pointer visit.
+ compiler_program_clean_llvm_resource = NULL;
+ interp_program_delete = NULL;
}
bool compilerLoaded;
diff --git a/src/cl_program.c b/src/cl_program.c
index 93eba03e..75262dba 100644
--- a/src/cl_program.c
+++ b/src/cl_program.c
@@ -112,8 +112,12 @@ cl_program_delete(cl_program p)
/* Free the program as allocated by the compiler */
if (p->opaque) {
if (CompilerSupported())
- compiler_program_clean_llvm_resource(p->opaque);
- interp_program_delete(p->opaque);
+ //For static variables release, gbeLoader may have been released, so
+ //compiler_program_clean_llvm_resource and interp_program_delete may be NULL.
+ if(compiler_program_clean_llvm_resource)
+ compiler_program_clean_llvm_resource(p->opaque);
+ if(interp_program_delete)
+ interp_program_delete(p->opaque);
}
p->magic = CL_MAGIC_DEAD_HEADER; /* For safety */