From 51a66f3e6c675a32a68acf63b52e2cfd55abf765 Mon Sep 17 00:00:00 2001 From: dirk Date: Sat, 8 Oct 2016 09:01:00 +0200 Subject: [PATCH] Unload OpenCL library inside OpenCLTerminus. --- MagickCore/opencl-private.h | 2 ++ MagickCore/opencl.c | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/MagickCore/opencl-private.h b/MagickCore/opencl-private.h index 840f9b2a3..e625b63be 100644 --- a/MagickCore/opencl-private.h +++ b/MagickCore/opencl-private.h @@ -234,6 +234,8 @@ typedef struct MagickLibraryRec MagickLibrary; struct MagickLibraryRec { + void *library; + MAGICKpfn_clGetPlatformIDs clGetPlatformIDs; MAGICKpfn_clGetPlatformInfo clGetPlatformInfo; diff --git a/MagickCore/opencl.c b/MagickCore/opencl.c index 21298119d..da23984ef 100644 --- a/MagickCore/opencl.c +++ b/MagickCore/opencl.c @@ -2335,24 +2335,23 @@ void *OsLibraryGetFunctionAddress(void *library,const char *functionName) static MagickBooleanType BindOpenCLFunctions() { - void - *library; - #ifdef MAGICKCORE_OPENCL_MACOSX #define BIND(X) openCL_library->X= &X; #else (void) ResetMagickMemory(openCL_library,0,sizeof(MagickLibrary)); #ifdef MAGICKCORE_WINDOWS_SUPPORT - library=(void *)LoadLibraryA("OpenCL.dll"); + openCL_library->library=(void *)LoadLibraryA("OpenCL.dll"); #else - library=(void *)dlopen("libOpenCL.so", RTLD_NOW); + openCL_library->library=(void *)dlopen("libOpenCL.so", RTLD_NOW); #endif - #define BIND(X) \ - if ((openCL_library->X=(MAGICKpfn_##X)OsLibraryGetFunctionAddress(library,#X)) == NULL) \ + if ((openCL_library->X=(MAGICKpfn_##X)OsLibraryGetFunctionAddress(openCL_library->library,#X)) == NULL) \ return(MagickFalse); #endif + if (openCL_library->library == (void*) NULL) + return(MagickFalse); + BIND(clGetPlatformIDs); BIND(clGetPlatformInfo); @@ -2423,11 +2422,11 @@ static MagickBooleanType LoadOpenCLLibrary(void) % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% AnnotateComponentTerminus() destroys the annotate component. +% OpenCLTerminus() destroys the OpenCL component. % -% The format of the AnnotateComponentTerminus method is: +% The format of the OpenCLTerminus method is: % -% AnnotateComponentTerminus(void) +% OpenCLTerminus(void) % */ @@ -2443,7 +2442,11 @@ MagickPrivate void OpenCLTerminus() if (openCL_lock != (SemaphoreInfo *) NULL) RelinquishSemaphoreInfo(&openCL_lock); if (openCL_library != (MagickLibrary *) NULL) - openCL_library=(MagickLibrary *)RelinquishMagickMemory(openCL_library); + { + if (openCL_library->library != (void *) NULL) + (void) lt_dlclose(openCL_library->library); + openCL_library=(MagickLibrary *) RelinquishMagickMemory(openCL_library); + } } /* -- 2.50.1