]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/registry.c
(no commit message)
[imagemagick] / MagickCore / registry.c
index dc97d71631d9bd7ed20f206e9e50f3f6766742ab..b8af0acfca5ab29fb1daba5ac9f34bf7aacd7793 100644 (file)
 %                       MagickCore Registry Methods                           %
 %                                                                             %
 %                              Software Design                                %
-%                                John Cristy                                  %
+%                                   Cristy                                    %
 %                                 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  %
@@ -75,9 +75,6 @@ static SplayTreeInfo
 
 static SemaphoreInfo
   *registry_semaphore = (SemaphoreInfo *) NULL;
-
-static volatile MagickBooleanType
-  instantiate_registry = MagickFalse;
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -203,7 +200,7 @@ MagickExport void *GetImageRegistry(const RegistryType type,const char *key,
   if (registry_info == (void *) NULL)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
-        "UnableToGetRegistryID","'%s'",key);
+        "UnableToGetRegistryID","`%s'",key);
       return((void *) NULL);
     }
   value=(void *) NULL;
@@ -300,7 +297,8 @@ MagickExport char *GetNextImageRegistry(void)
 */
 MagickPrivate MagickBooleanType RegistryComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&registry_semaphore);
+  if (registry_semaphore == (SemaphoreInfo *) NULL)
+    registry_semaphore=AcquireSemaphoreInfo();
   return(MagickTrue);
 }
 \f
@@ -325,15 +323,14 @@ MagickPrivate MagickBooleanType RegistryComponentGenesis(void)
 MagickPrivate void RegistryComponentTerminus(void)
 {
   if (registry_semaphore == (SemaphoreInfo *) NULL)
-    AcquireSemaphoreInfo(&registry_semaphore);
+    ActivateSemaphoreInfo(&registry_semaphore);
   LockSemaphoreInfo(registry_semaphore);
   if (IsEventLogging() != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   if (registry != (void *) NULL)
     registry=DestroySplayTree(registry);
-  instantiate_registry=MagickFalse;
   UnlockSemaphoreInfo(registry_semaphore);
-  DestroySemaphoreInfo(&registry_semaphore);
+  RelinquishSemaphoreInfo(&registry_semaphore);
 }
 \f
 /*
@@ -469,6 +466,8 @@ MagickExport MagickBooleanType SetImageRegistry(const RegistryType type,
 
   if (IsEventLogging() != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
+  if (value == (const void *) NULL)
+    return(MagickFalse);
   clone_value=(void *) NULL;
   switch (type)
   {
@@ -522,19 +521,14 @@ MagickExport MagickBooleanType SetImageRegistry(const RegistryType type,
   registry_info->type=type;
   registry_info->value=clone_value;
   registry_info->signature=MagickSignature;
-  if ((registry == (SplayTreeInfo *) NULL) &&
-      (instantiate_registry == MagickFalse))
+  if (registry == (SplayTreeInfo *) NULL)
     {
       if (registry_semaphore == (SemaphoreInfo *) NULL)
-        AcquireSemaphoreInfo(&registry_semaphore);
+        ActivateSemaphoreInfo(&registry_semaphore);
       LockSemaphoreInfo(registry_semaphore);
-      if ((registry == (SplayTreeInfo *) NULL) &&
-          (instantiate_registry == MagickFalse))
-        {
-          registry=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory,
-            DestroyRegistryNode);
-          instantiate_registry=MagickTrue;
-        }
+      if (registry == (SplayTreeInfo *) NULL)
+        registry=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory,
+          DestroyRegistryNode);
       UnlockSemaphoreInfo(registry_semaphore);
     }
   status=AddValueToSplayTree(registry,ConstantString(key),registry_info);