]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/module.c
The 8bim profile will be updated when the iptc profile is changed.
[imagemagick] / MagickCore / module.c
index d76e094ecbc18c118d3a5a8a8fe2b21f1f494efc..94acdd43aae34674712bedf4100569de8803d350 100644 (file)
@@ -17,7 +17,7 @@
 %                                March 2000                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -93,9 +93,6 @@ static SemaphoreInfo
 
 static SplayTreeInfo
   *module_list = (SplayTreeInfo *) NULL;
-
-static volatile MagickBooleanType
-  instantiate_module = MagickFalse;
 \f
 /*
   Forward declarations.
@@ -105,7 +102,7 @@ static const ModuleInfo
 
 static MagickBooleanType
   GetMagickModulePath(const char *,MagickModuleType,char *,ExceptionInfo *),
-  InitializeModuleList(ExceptionInfo *),
+  IsModuleTreeInstantiated(ExceptionInfo *),
   UnregisterModule(const ModuleInfo *,ExceptionInfo *);
 
 static void
@@ -184,13 +181,6 @@ MagickExport void DestroyModuleList(void)
 #if defined(MAGICKCORE_MODULES_SUPPORT)
   if (module_list != (SplayTreeInfo *) NULL)
     module_list=DestroySplayTree(module_list);
-  if (instantiate_module != MagickFalse)
-    {
-#if !defined(MAGICKCORE_JP2_DELEGATE)
-      (void) lt_dlexit();  /* Jasper has an errant atexit() handler */
-#endif
-      instantiate_module=MagickFalse;
-    }
 #endif
   UnlockSemaphoreInfo(module_semaphore);
 }
@@ -225,29 +215,26 @@ MagickExport void DestroyModuleList(void)
 */
 MagickExport ModuleInfo *GetModuleInfo(const char *tag,ExceptionInfo *exception)
 {
-  if ((module_list == (SplayTreeInfo *) NULL) ||
-      (instantiate_module == MagickFalse))
-    if (InitializeModuleList(exception) == MagickFalse)
-      return((ModuleInfo *) NULL);
-  if ((module_list == (SplayTreeInfo *) NULL) ||
-      (GetNumberOfNodesInSplayTree(module_list) == 0))
+  ModuleInfo
+    *module_info;
+
+  if (IsModuleTreeInstantiated(exception) == MagickFalse)
     return((ModuleInfo *) NULL);
+  LockSemaphoreInfo(module_semaphore);
+  ResetSplayTreeIterator(module_list);
   if ((tag == (const char *) NULL) || (LocaleCompare(tag,"*") == 0))
     {
-      ModuleInfo
-        *p;
-
 #if defined(MAGICKCORE_MODULES_SUPPORT)
       if (LocaleCompare(tag,"*") == 0)
         (void) OpenModules(exception);
 #endif
-      LockSemaphoreInfo(module_semaphore);
-      ResetSplayTreeIterator(module_list);
-      p=(ModuleInfo *) GetNextValueInSplayTree(module_list);
+      module_info=(ModuleInfo *) GetNextValueInSplayTree(module_list);
       UnlockSemaphoreInfo(module_semaphore);
-      return(p);
+      return(module_info);
     }
-  return((ModuleInfo *) GetValueFromSplayTree(module_list,tag));
+  module_info=(ModuleInfo *) GetValueFromSplayTree(module_list,tag);
+  UnlockSemaphoreInfo(module_semaphore);
+  return(module_info);
 }
 \f
 /*
@@ -470,8 +457,7 @@ MagickExport char **GetModuleList(const char *pattern,
       modules=(char **) RelinquishMagickMemory(modules);
       return((char **) NULL);
     }
-  buffer=(struct dirent *) AcquireMagickMemory(sizeof(*buffer)+
-    FILENAME_MAX+1);
+  buffer=(struct dirent *) AcquireMagickMemory(sizeof(*buffer)+FILENAME_MAX+1);
   if (buffer == (struct dirent *) NULL)
     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
   i=0;
@@ -766,9 +752,8 @@ static MagickBooleanType GetMagickModulePath(const char *filename,
       }
       (void) CopyMagickString(prefix,GetClientPath(),MaxTextExtent);
       ChopPathComponents(prefix,1);
-      (void) FormatLocaleString(path,MaxTextExtent,
-        "%s/lib/%s/modules-Q%d/%s/%s",prefix,MAGICKCORE_LIBRARY_RELATIVE_PATH,
-        MAGICKCORE_QUANTUM_DEPTH,directory,filename);
+      (void) FormatLocaleString(path,MaxTextExtent,"%s/lib/%s/%s/%s",prefix,
+        MAGICKCORE_MODULES_RELATIVE_PATH,directory,filename);
 #endif
       if (IsPathAccessible(path) != MagickFalse)
         return(MagickTrue);
@@ -799,9 +784,10 @@ static MagickBooleanType GetMagickModulePath(const char *filename,
     if (home != (char *) NULL)
       {
         /*
-          Search $HOME/.magick.
+          Search $HOME/.config/ImageMagick.
         */
-        (void) FormatLocaleString(path,MaxTextExtent,"%s%s.magick%s%s",home,
+        (void) FormatLocaleString(path,MaxTextExtent,
+          "%s%s.config%sImageMagick%s%s",home,DirectorySeparator,
           DirectorySeparator,DirectorySeparator,filename);
         home=DestroyString(home);
         if (IsPathAccessible(path) != MagickFalse)
@@ -816,7 +802,6 @@ static MagickBooleanType GetMagickModulePath(const char *filename,
   if (exception->severity < ConfigureError)
     ThrowFileException(exception,ConfigureWarning,"UnableToOpenModuleFile",
       path);
-  return(MagickFalse);
 #endif
   return(MagickFalse);
 }
@@ -826,17 +811,18 @@ static MagickBooleanType GetMagickModulePath(const char *filename,
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   I n i t i a l i z e M o d u l e L i s t                                   %
+%   I s M o d u l e T r e e I n s t a n t i a t e d                           %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  InitializeModuleList() initializes the module loader.
+%  IsModuleTreeInstantiated() determines if the module tree is instantiated.
+%  If not, it instantiates the tree and returns it.
 %
-%  The format of the InitializeModuleList() method is:
+%  The format of the IsModuleTreeInstantiated() method is:
 %
-%      InitializeModuleList(Exceptioninfo *exception)
+%      IsModuleTreeInstantiated(Exceptioninfo *exception)
 %
 %  A description of each parameter follows.
 %
@@ -864,17 +850,15 @@ static void *DestroyModuleNode(void *module_info)
   return(RelinquishMagickMemory(p));
 }
 
-static MagickBooleanType InitializeModuleList(
+static MagickBooleanType IsModuleTreeInstantiated(
   ExceptionInfo *magick_unused(exception))
 {
-  if ((module_list == (SplayTreeInfo *) NULL) &&
-      (instantiate_module == MagickFalse))
+  if (module_list == (SplayTreeInfo *) NULL)
     {
       if (module_semaphore == (SemaphoreInfo *) NULL)
-        AcquireSemaphoreInfo(&module_semaphore);
+        ActivateSemaphoreInfo(&module_semaphore);
       LockSemaphoreInfo(module_semaphore);
-      if ((module_list == (SplayTreeInfo *) NULL) &&
-          (instantiate_module == MagickFalse))
+      if (module_list == (SplayTreeInfo *) NULL)
         {
           MagickBooleanType
             status;
@@ -896,7 +880,6 @@ static MagickBooleanType InitializeModuleList(
           if (lt_dlinit() != 0)
             ThrowFatalException(ModuleFatalError,
               "UnableToInitializeModuleLoader");
-          instantiate_module=MagickTrue;
         }
       UnlockSemaphoreInfo(module_semaphore);
     }
@@ -986,7 +969,7 @@ MagickExport MagickBooleanType InvokeDynamicImageFilter(const char *tag,
   if (status == MagickFalse)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-        "UnableToLoadModule","`%s': %s",name,path);
+        "UnableToLoadModule","'%s': %s",name,path);
       return(MagickFalse);
     }
   /*
@@ -996,7 +979,7 @@ MagickExport MagickBooleanType InvokeDynamicImageFilter(const char *tag,
   if (handle == (ModuleHandle) NULL)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-        "UnableToLoadModule","`%s': %s",name,lt_dlerror());
+        "UnableToLoadModule","'%s': %s",name,lt_dlerror());
       return(MagickFalse);
     }
   /*
@@ -1015,7 +998,7 @@ MagickExport MagickBooleanType InvokeDynamicImageFilter(const char *tag,
   image_filter=(ImageFilterHandler *) lt_dlsym(handle,name);
   if (image_filter == (ImageFilterHandler *) NULL)
     (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-      "UnableToLoadModule","`%s': %s",name,lt_dlerror());
+      "UnableToLoadModule","'%s': %s",name,lt_dlerror());
   else
     {
       size_t
@@ -1030,7 +1013,7 @@ MagickExport MagickBooleanType InvokeDynamicImageFilter(const char *tag,
           tag);
       if (signature != MagickImageFilterSignature)
         (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-          "ImageFilterSignatureMismatch","`%s': %8lx != %8lx",tag,
+          "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag,
           (unsigned long) signature,(unsigned long) MagickImageFilterSignature);
     }
   /*
@@ -1038,7 +1021,7 @@ MagickExport MagickBooleanType InvokeDynamicImageFilter(const char *tag,
   */
   if (lt_dlclose(handle) != 0)
     (void) ThrowMagickException(exception,GetMagickModule(),ModuleWarning,
-      "UnableToCloseModule","`%s': %s",name,lt_dlerror());
+      "UnableToCloseModule","'%s': %s",name,lt_dlerror());
   return(exception->severity < ErrorException ? MagickTrue : MagickFalse);
 }
 \f
@@ -1166,9 +1149,10 @@ MagickPrivate MagickBooleanType ModuleComponentGenesis(void)
   MagickBooleanType
     status;
 
-  AcquireSemaphoreInfo(&module_semaphore);
+  if (module_semaphore == (SemaphoreInfo *) NULL)
+    module_semaphore=AcquireSemaphoreInfo();
   exception=AcquireExceptionInfo();
-  status=InitializeModuleList(exception);
+  status=IsModuleTreeInstantiated(exception);
   exception=DestroyExceptionInfo(exception);
   return(status);
 }
@@ -1194,9 +1178,9 @@ MagickPrivate MagickBooleanType ModuleComponentGenesis(void)
 MagickPrivate void ModuleComponentTerminus(void)
 {
   if (module_semaphore == (SemaphoreInfo *) NULL)
-    AcquireSemaphoreInfo(&module_semaphore);
+    ActivateSemaphoreInfo(&module_semaphore);
   DestroyModuleList();
-  DestroySemaphoreInfo(&module_semaphore);
+  RelinquishSemaphoreInfo(&module_semaphore);
 }
 \f
 /*
@@ -1281,7 +1265,7 @@ MagickPrivate MagickBooleanType OpenModule(const char *module,
   if (handle == (ModuleHandle) NULL)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-        "UnableToLoadModule","`%s': %s",path,lt_dlerror());
+        "UnableToLoadModule","'%s': %s",path,lt_dlerror());
       return(MagickFalse);
     }
   /*
@@ -1299,7 +1283,7 @@ MagickPrivate MagickBooleanType OpenModule(const char *module,
   if (module_info->register_module == (size_t (*)(void)) NULL)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-        "UnableToRegisterImageFormat","`%s': %s",module_name,lt_dlerror());
+        "UnableToRegisterImageFormat","'%s': %s",module_name,lt_dlerror());
       return(MagickFalse);
     }
   (void) LogMagickEvent(ModuleEvent,GetMagickModule(),
@@ -1313,7 +1297,7 @@ MagickPrivate MagickBooleanType OpenModule(const char *module,
   if (module_info->unregister_module == (void (*)(void)) NULL)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-        "UnableToRegisterImageFormat","`%s': %s",module_name,lt_dlerror());
+        "UnableToRegisterImageFormat","'%s': %s",module_name,lt_dlerror());
       return(MagickFalse);
     }
   (void) LogMagickEvent(ModuleEvent,GetMagickModule(),
@@ -1323,7 +1307,7 @@ MagickPrivate MagickBooleanType OpenModule(const char *module,
   if (signature != MagickImageCoderSignature)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-        "ImageCoderSignatureMismatch","`%s': %8lx != %8lx",module_name,
+        "ImageCoderSignatureMismatch","'%s': %8lx != %8lx",module_name,
         (unsigned long) signature,(unsigned long) MagickImageCoderSignature);
       return(MagickFalse);
     }
@@ -1608,12 +1592,18 @@ static MagickBooleanType UnregisterModule(const ModuleInfo *module_info,
   if (lt_dlclose((ModuleHandle) module_info->handle) != 0)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),ModuleWarning,
-        "UnableToCloseModule","`%s': %s",module_info->tag,lt_dlerror());
+        "UnableToCloseModule","'%s': %s",module_info->tag,lt_dlerror());
       return(MagickFalse);
     }
   return(MagickTrue);
 }
 #else
+
+#if !defined(MAGICKCORE_BUILD_MODULES)
+extern size_t
+  analyzeImage(Image **,const int,const char **,ExceptionInfo *);
+#endif
+
 MagickExport MagickBooleanType ListModuleInfo(FILE *magick_unused(file),
   ExceptionInfo *magick_unused(exception))
 {
@@ -1645,9 +1635,6 @@ MagickExport MagickBooleanType InvokeDynamicImageFilter(const char *tag,
   (void) exception;
 #else
   {
-    extern size_t
-      analyzeImage(Image **,const int,const char **,ExceptionInfo *);
-
     ImageFilterHandler
       *image_filter;
 
@@ -1672,7 +1659,7 @@ MagickExport MagickBooleanType InvokeDynamicImageFilter(const char *tag,
         if (signature != MagickImageFilterSignature)
           {
             (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
-              "ImageFilterSignatureMismatch","`%s': %8lx != %8lx",tag,
+              "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag,
               (unsigned long) signature,(unsigned long)
               MagickImageFilterSignature);
             return(MagickFalse);