]> granicus.if.org Git - imagemagick/commitdiff
Unload OpenCL library inside OpenCLTerminus.
authordirk <dirk@git.imagemagick.org>
Sat, 8 Oct 2016 07:01:00 +0000 (09:01 +0200)
committerdirk <dirk@git.imagemagick.org>
Sat, 8 Oct 2016 07:04:40 +0000 (09:04 +0200)
MagickCore/opencl-private.h
MagickCore/opencl.c

index 840f9b2a3fe6fc1c386d6375d88a6e7ea51e1460..e625b63be861bb351abc5a1205f036f4ed358ea2 100644 (file)
@@ -234,6 +234,8 @@ typedef struct MagickLibraryRec MagickLibrary;
 
 struct MagickLibraryRec
 {
+  void *library;
+
   MAGICKpfn_clGetPlatformIDs          clGetPlatformIDs;
   MAGICKpfn_clGetPlatformInfo         clGetPlatformInfo;
 
index 21298119d5643c7d0f46520639c903402a79df7a..da23984ef9af38cb7d4e4803f1a01ebde7f405e4 100644 (file)
@@ -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);
+    }
 }
 
 /*