diff --git a/magick/cache.c b/magick/cache.c
index 9618e1d..e7a3f5d 100644
--- a/magick/cache.c
+++ b/magick/cache.c
@@ -204,6 +204,7 @@
       (instantiate_cache == MagickFalse))
     {
       AcquireSemaphoreInfo(&cache_semaphore);
+      LockSemaphoreInfo(cache_semaphore);
       if ((cache_resources == (SplayTreeInfo *) NULL) &&
           (instantiate_cache == MagickFalse))
         {
@@ -211,7 +212,7 @@
             NULL,(void *(*)(void *)) NULL,(void *(*)(void *)) NULL);
           instantiate_cache=MagickTrue;
         }
-      RelinquishSemaphoreInfo(cache_semaphore);
+      UnlockSemaphoreInfo(cache_semaphore);
     }
   (void) AddValueToSplayTree(cache_resources,cache_info,cache_info);
   return((Cache ) cache_info);
@@ -283,8 +284,8 @@
 */
 MagickExport MagickBooleanType CacheComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&cache_semaphore);
-  RelinquishSemaphoreInfo(cache_semaphore);
+  assert(cache_semaphore == (SemaphoreInfo *) NULL);
+  cache_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -308,11 +309,13 @@
 */
 MagickExport void CacheComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&cache_semaphore);
+  if (cache_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&cache_semaphore);
+  LockSemaphoreInfo(cache_semaphore);
   if (cache_resources != (SplayTreeInfo *) NULL)
     cache_resources=DestroySplayTree(cache_resources);
   instantiate_cache=MagickFalse;
-  RelinquishSemaphoreInfo(cache_semaphore);
+  UnlockSemaphoreInfo(cache_semaphore);
   DestroySemaphoreInfo(&cache_semaphore);
 }
 
@@ -597,11 +600,11 @@
   int
     status;
 
-  AcquireSemaphoreInfo(&cache_info->disk_semaphore);
+  LockSemaphoreInfo(cache_info->disk_semaphore);
   status=close(cache_info->file);
   cache_info->file=(-1);
   RelinquishMagickResource(FileResource,1);
-  RelinquishSemaphoreInfo(cache_info->disk_semaphore);
+  UnlockSemaphoreInfo(cache_info->disk_semaphore);
   return(status == -1 ? MagickFalse : MagickTrue);
 }
 
@@ -616,10 +619,10 @@
   */
   if (GetMagickResource(FileResource) < GetMagickResourceLimit(FileResource))
     return;
-  AcquireSemaphoreInfo(&cache_semaphore);
+  LockSemaphoreInfo(cache_semaphore);
   if (cache_resources == (SplayTreeInfo *) NULL)
     {
-      RelinquishSemaphoreInfo(cache_semaphore);
+      UnlockSemaphoreInfo(cache_semaphore);
       return;
     }
   ResetSplayTreeIterator(cache_resources);
@@ -645,7 +648,7 @@
   }
   if (q != (CacheInfo *) NULL)
     (void) ClosePixelCacheOnDisk(q);  /* relinquish least recently used cache */
-  RelinquishSemaphoreInfo(cache_semaphore);
+  UnlockSemaphoreInfo(cache_semaphore);
 }
 
 static inline MagickSizeType MagickMax(const MagickSizeType x,
@@ -673,10 +676,10 @@
   /*
     Open pixel cache on disk.
   */
-  AcquireSemaphoreInfo(&cache_info->disk_semaphore);
+  LockSemaphoreInfo(cache_info->disk_semaphore);
   if (cache_info->file != -1)
     {
-      RelinquishSemaphoreInfo(cache_info->disk_semaphore);
+      UnlockSemaphoreInfo(cache_info->disk_semaphore);
       return(MagickTrue);  /* cache already open */
     }
   LimitPixelCacheDescriptors();
@@ -710,13 +713,13 @@
     }
   if (file == -1)
     {
-      RelinquishSemaphoreInfo(cache_info->disk_semaphore);
+      UnlockSemaphoreInfo(cache_info->disk_semaphore);
       return(MagickFalse);
     }
   (void) AcquireMagickResource(FileResource,1);
   cache_info->file=file;
   cache_info->timestamp=time(0);
-  RelinquishSemaphoreInfo(cache_info->disk_semaphore);
+  UnlockSemaphoreInfo(cache_info->disk_semaphore);
   return(MagickTrue);
 }
 
diff --git a/magick/coder.c b/magick/coder.c
index e6c8675..bdb8ad1 100644
--- a/magick/coder.c
+++ b/magick/coder.c
@@ -255,8 +255,8 @@
 */
 MagickExport MagickBooleanType CoderComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&coder_semaphore);
-  RelinquishSemaphoreInfo(coder_semaphore);
+  assert(coder_semaphore == (SemaphoreInfo *) NULL);
+  coder_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -280,11 +280,13 @@
 */
 MagickExport void CoderComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&coder_semaphore);
+  if (coder_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&coder_semaphore);
+  LockSemaphoreInfo(coder_semaphore);
   if (coder_list != (SplayTreeInfo *) NULL)
     coder_list=DestroySplayTree(coder_list);
   instantiate_coder=MagickFalse;
-  RelinquishSemaphoreInfo(coder_semaphore);
+  UnlockSemaphoreInfo(coder_semaphore);
   DestroySemaphoreInfo(&coder_semaphore);
 }
 
@@ -401,7 +403,7 @@
   /*
     Generate coder list.
   */
-  AcquireSemaphoreInfo(&coder_semaphore);
+  LockSemaphoreInfo(coder_semaphore);
   ResetSplayTreeIterator(coder_list);
   p=(const CoderInfo *) GetNextValueInSplayTree(coder_list);
   for (i=0; p != (const CoderInfo *) NULL; )
@@ -411,7 +413,7 @@
       coder_map[i++]=p;
     p=(const CoderInfo *) GetNextValueInSplayTree(coder_list);
   }
-  RelinquishSemaphoreInfo(coder_semaphore);
+  UnlockSemaphoreInfo(coder_semaphore);
   qsort((void *) coder_map,(size_t) i,sizeof(*coder_map),CoderInfoCompare);
   coder_map[i]=(CoderInfo *) NULL;
   *number_coders=(unsigned long) i;
@@ -486,7 +488,7 @@
   /*
     Generate coder list.
   */
-  AcquireSemaphoreInfo(&coder_semaphore);
+  LockSemaphoreInfo(coder_semaphore);
   ResetSplayTreeIterator(coder_list);
   p=(const CoderInfo *) GetNextValueInSplayTree(coder_list);
   for (i=0; p != (const CoderInfo *) NULL; )
@@ -496,7 +498,7 @@
       coder_map[i++]=ConstantString(p->name);
     p=(const CoderInfo *) GetNextValueInSplayTree(coder_list);
   }
-  RelinquishSemaphoreInfo(coder_semaphore);
+  UnlockSemaphoreInfo(coder_semaphore);
   qsort((void *) coder_map,(size_t) i,sizeof(*coder_map),CoderCompare);
   coder_map[i]=(char *) NULL;
   *number_coders=(unsigned long) i;
@@ -531,13 +533,14 @@
       (instantiate_coder == MagickFalse))
     {
       AcquireSemaphoreInfo(&coder_semaphore);
+      LockSemaphoreInfo(coder_semaphore);
       if ((coder_list == (SplayTreeInfo *) NULL) &&
           (instantiate_coder == MagickFalse))
         {
           (void) LoadCoderLists(MagickCoderFilename,exception);
           instantiate_coder=MagickTrue;
         }
-      RelinquishSemaphoreInfo(coder_semaphore);
+      UnlockSemaphoreInfo(coder_semaphore);
     }
   return(coder_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
 }
diff --git a/magick/color.c b/magick/color.c
index 4b1f811..a6926ee 100644
--- a/magick/color.c
+++ b/magick/color.c
@@ -816,8 +816,8 @@
 */
 MagickExport MagickBooleanType ColorComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&color_semaphore);
-  RelinquishSemaphoreInfo(color_semaphore);
+  assert(color_semaphore == (SemaphoreInfo *) NULL);
+  color_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -859,11 +859,13 @@
 
 MagickExport void ColorComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&color_semaphore);
+  if (color_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&color_semaphore);
+  LockSemaphoreInfo(color_semaphore);
   if (color_list != (LinkedListInfo *) NULL)
     color_list=DestroyLinkedList(color_list,DestroyColorElement);
   instantiate_color=MagickFalse;
-  RelinquishSemaphoreInfo(color_semaphore);
+  UnlockSemaphoreInfo(color_semaphore);
   DestroySemaphoreInfo(&color_semaphore);
 }
 
@@ -932,7 +934,7 @@
   /*
     Search for color tag.
   */
-  AcquireSemaphoreInfo(&color_semaphore);
+  LockSemaphoreInfo(color_semaphore);
   ResetLinkedListIterator(color_list);
   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
   while (p != (const ColorInfo *) NULL)
@@ -947,7 +949,7 @@
   else
     (void) InsertValueInLinkedList(color_list,0,
       RemoveElementByValueFromLinkedList(color_list,p));
-  RelinquishSemaphoreInfo(color_semaphore);
+  UnlockSemaphoreInfo(color_semaphore);
   return(p);
 }
 
@@ -1020,6 +1022,14 @@
     default:
       break;
   }
+  if ((pixel->colorspace == HSLColorspace) ||
+      (pixel->colorspace == HSBColorspace))
+    {
+      (void) FormatMagickString(component,MaxTextExtent,"%g%%",
+        (double) (100.0*QuantumScale*color));
+      (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
+      return;
+    }
   if (compliance != SVGCompliance)
     {
       if (pixel->depth > 16)
@@ -1138,7 +1148,7 @@
   /*
     Generate color list.
   */
-  AcquireSemaphoreInfo(&color_semaphore);
+  LockSemaphoreInfo(color_semaphore);
   ResetLinkedListIterator(color_list);
   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
   for (i=0; p != (const ColorInfo *) NULL; )
@@ -1148,7 +1158,7 @@
       colors[i++]=p;
     p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
   }
-  RelinquishSemaphoreInfo(color_semaphore);
+  UnlockSemaphoreInfo(color_semaphore);
   qsort((void *) colors,(size_t) i,sizeof(*colors),ColorInfoCompare);
   colors[i]=(ColorInfo *) NULL;
   *number_colors=(unsigned long) i;
@@ -1231,7 +1241,7 @@
   /*
     Generate color list.
   */
-  AcquireSemaphoreInfo(&color_semaphore);
+  LockSemaphoreInfo(color_semaphore);
   ResetLinkedListIterator(color_list);
   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
   for (i=0; p != (const ColorInfo *) NULL; )
@@ -1241,7 +1251,7 @@
       colors[i++]=ConstantString(p->name);
     p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
   }
-  RelinquishSemaphoreInfo(color_semaphore);
+  UnlockSemaphoreInfo(color_semaphore);
   qsort((void *) colors,(size_t) i,sizeof(*colors),ColorCompare);
   colors[i]=(char *) NULL;
   *number_colors=(unsigned long) i;
@@ -1447,13 +1457,14 @@
       (instantiate_color == MagickFalse))
     {
       AcquireSemaphoreInfo(&color_semaphore);
+      LockSemaphoreInfo(color_semaphore);
       if ((color_list == (LinkedListInfo *) NULL) &&
           (instantiate_color == MagickFalse))
         {
           (void) LoadColorLists(ColorFilename,exception);
           instantiate_color=MagickTrue;
         }
-      RelinquishSemaphoreInfo(color_semaphore);
+      UnlockSemaphoreInfo(color_semaphore);
     }
   return(color_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
 }
diff --git a/magick/configure.c b/magick/configure.c
index 5dee531..eb89731 100644
--- a/magick/configure.c
+++ b/magick/configure.c
@@ -114,8 +114,8 @@
 */
 MagickExport MagickBooleanType ConfigureComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&configure_semaphore);
-  RelinquishSemaphoreInfo(configure_semaphore);
+  assert(configure_semaphore == (SemaphoreInfo *) NULL);
+  configure_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -159,12 +159,14 @@
 
 MagickExport void ConfigureComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&configure_semaphore);
+  if (configure_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&configure_semaphore);
+  LockSemaphoreInfo(configure_semaphore);
   if (configure_list != (LinkedListInfo *) NULL)
     configure_list=DestroyLinkedList(configure_list,DestroyConfigureElement);
   configure_list=(LinkedListInfo *) NULL;
   instantiate_configure=MagickFalse;
-  RelinquishSemaphoreInfo(configure_semaphore);
+  UnlockSemaphoreInfo(configure_semaphore);
   DestroySemaphoreInfo(&configure_semaphore);
 }
 
@@ -252,7 +254,7 @@
   /*
     Search for configure tag.
   */
-  AcquireSemaphoreInfo(&configure_semaphore);
+  LockSemaphoreInfo(configure_semaphore);
   ResetLinkedListIterator(configure_list);
   p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
   while (p != (const ConfigureInfo *) NULL)
@@ -264,7 +266,7 @@
   if (p != (ConfigureInfo *) NULL)
     (void) InsertValueInLinkedList(configure_list,0,
       RemoveElementByValueFromLinkedList(configure_list,p));
-  RelinquishSemaphoreInfo(configure_semaphore);
+  UnlockSemaphoreInfo(configure_semaphore);
   return(p);
 }
 
@@ -348,7 +350,7 @@
   /*
     Generate configure list.
   */
-  AcquireSemaphoreInfo(&configure_semaphore);
+  LockSemaphoreInfo(configure_semaphore);
   ResetLinkedListIterator(configure_list);
   p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
   for (i=0; p != (const ConfigureInfo *) NULL; )
@@ -358,7 +360,7 @@
       options[i++]=p;
     p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
   }
-  RelinquishSemaphoreInfo(configure_semaphore);
+  UnlockSemaphoreInfo(configure_semaphore);
   qsort((void *) options,(size_t) i,sizeof(*options),ConfigureInfoCompare);
   options[i]=(ConfigureInfo *) NULL;
   *number_options=(unsigned long) i;
@@ -435,13 +437,11 @@
   p=GetConfigureInfo("*",exception);
   if (p == (const ConfigureInfo *) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&configure_semaphore);
-  RelinquishSemaphoreInfo(configure_semaphore);
   options=(char **) AcquireQuantumMemory((size_t)
     GetNumberOfElementsInLinkedList(configure_list)+1UL,sizeof(*options));
   if (options == (char **) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&configure_semaphore);
+  LockSemaphoreInfo(configure_semaphore);
   ResetLinkedListIterator(configure_list);
   p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
   for (i=0; p != (const ConfigureInfo *) NULL; )
@@ -451,7 +451,7 @@
       options[i++]=ConstantString(p->name);
     p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
   }
-  RelinquishSemaphoreInfo(configure_semaphore);
+  UnlockSemaphoreInfo(configure_semaphore);
   qsort((void *) options,(size_t) i,sizeof(*options),ConfigureCompare);
   options[i]=(char *) NULL;
   *number_options=(unsigned long) i;
@@ -869,13 +869,14 @@
       (instantiate_configure == MagickFalse))
     {
       AcquireSemaphoreInfo(&configure_semaphore);
+      LockSemaphoreInfo(configure_semaphore);
       if ((configure_list == (LinkedListInfo *) NULL) &&
           (instantiate_configure == MagickFalse))
         {
           (void) LoadConfigureLists(ConfigureFilename,exception);
           instantiate_configure=MagickTrue;
         }
-      RelinquishSemaphoreInfo(configure_semaphore);
+      UnlockSemaphoreInfo(configure_semaphore);
     }
   return(configure_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
 }
diff --git a/magick/constitute.c b/magick/constitute.c
index 96283b4..12f74f7 100644
--- a/magick/constitute.c
+++ b/magick/constitute.c
@@ -94,8 +94,8 @@
 */
 MagickExport MagickBooleanType ConstituteComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&constitute_semaphore);
-  RelinquishSemaphoreInfo(constitute_semaphore);
+  assert(constitute_semaphore == (SemaphoreInfo *) NULL);
+  constitute_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -119,8 +119,9 @@
 */
 MagickExport void ConstituteComponentTerminus(void)
 {
-  if (constitute_semaphore != (SemaphoreInfo *) NULL)
-    DestroySemaphoreInfo(&constitute_semaphore);
+  if (constitute_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&constitute_semaphore);
+  DestroySemaphoreInfo(&constitute_semaphore);
 }
 
 /*
@@ -514,10 +515,13 @@
     {
       thread_support=GetMagickThreadSupport(magick_info);
       if ((thread_support & DecoderThreadSupport) == 0)
-        AcquireSemaphoreInfo(&constitute_semaphore);
+        {
+          AcquireSemaphoreInfo(&constitute_semaphore);
+          LockSemaphoreInfo(constitute_semaphore);
+        }
       image=GetImageDecoder(magick_info)(read_info,exception);
       if ((thread_support & DecoderThreadSupport) == 0)
-        RelinquishSemaphoreInfo(constitute_semaphore);
+        UnlockSemaphoreInfo(constitute_semaphore);
     }
   else
     {
@@ -546,11 +550,14 @@
         MaxTextExtent);
       *read_info->filename='\0';
       if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
-        AcquireSemaphoreInfo(&constitute_semaphore);
+        {
+          AcquireSemaphoreInfo(&constitute_semaphore);
+          LockSemaphoreInfo(constitute_semaphore);
+        }
       (void) InvokeDelegate(read_info,image,read_info->magick,(char *) NULL,
         exception);
       if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
-        RelinquishSemaphoreInfo(constitute_semaphore);
+        UnlockSemaphoreInfo(constitute_semaphore);
       image=DestroyImageList(image);
       read_info->temporary=MagickTrue;
       (void) SetImageInfo(read_info,MagickFalse,exception);
@@ -570,10 +577,13 @@
         }
       thread_support=GetMagickThreadSupport(magick_info);
       if ((thread_support & DecoderThreadSupport) == 0)
-        AcquireSemaphoreInfo(&constitute_semaphore);
+        {
+          AcquireSemaphoreInfo(&constitute_semaphore);
+          LockSemaphoreInfo(constitute_semaphore);
+        }
       image=(Image *) (GetImageDecoder(magick_info))(read_info,exception);
       if ((thread_support & DecoderThreadSupport) == 0)
-        RelinquishSemaphoreInfo(constitute_semaphore);
+        UnlockSemaphoreInfo(constitute_semaphore);
     }
   if (read_info->temporary != MagickFalse)
     {
@@ -1099,10 +1109,13 @@
       */
       thread_support=GetMagickThreadSupport(magick_info);
       if ((thread_support & EncoderThreadSupport) == 0)
-        AcquireSemaphoreInfo(&constitute_semaphore);
+        {
+          AcquireSemaphoreInfo(&constitute_semaphore);
+          LockSemaphoreInfo(constitute_semaphore);
+        }
       status=GetImageEncoder(magick_info)(write_info,image);
       if ((thread_support & EncoderThreadSupport) == 0)
-        RelinquishSemaphoreInfo(constitute_semaphore);
+        UnlockSemaphoreInfo(constitute_semaphore);
     }
   else
     {
@@ -1115,11 +1128,14 @@
           */
           *write_info->filename='\0';
           if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
-            AcquireSemaphoreInfo(&constitute_semaphore);
+            {
+              AcquireSemaphoreInfo(&constitute_semaphore);
+              LockSemaphoreInfo(constitute_semaphore);
+            }
           status=InvokeDelegate(write_info,image,(char *) NULL,
             write_info->magick,&image->exception);
           if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
-            RelinquishSemaphoreInfo(constitute_semaphore);
+            UnlockSemaphoreInfo(constitute_semaphore);
           (void) CopyMagickString(image->filename,filename,MaxTextExtent);
         }
       else
@@ -1146,10 +1162,13 @@
               */
               thread_support=GetMagickThreadSupport(magick_info);
               if ((thread_support & EncoderThreadSupport) == 0)
-                AcquireSemaphoreInfo(&constitute_semaphore);
+                {
+                  AcquireSemaphoreInfo(&constitute_semaphore);
+                  LockSemaphoreInfo(constitute_semaphore);
+                }
               status=GetImageEncoder(magick_info)(write_info,image);
               if ((thread_support & EncoderThreadSupport) == 0)
-                RelinquishSemaphoreInfo(constitute_semaphore);
+                UnlockSemaphoreInfo(constitute_semaphore);
             }
         }
     }
diff --git a/magick/delegate.c b/magick/delegate.c
index 822881a..9706f2d 100644
--- a/magick/delegate.c
+++ b/magick/delegate.c
@@ -164,8 +164,8 @@
 */
 MagickExport MagickBooleanType DelegateComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&delegate_semaphore);
-  RelinquishSemaphoreInfo(delegate_semaphore);
+  assert(delegate_semaphore == (SemaphoreInfo *) NULL);
+  delegate_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -209,11 +209,13 @@
 
 MagickExport void DelegateComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&delegate_semaphore);
+  if (delegate_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&delegate_semaphore);
+  LockSemaphoreInfo(delegate_semaphore);
   if (delegate_list != (LinkedListInfo *) NULL)
     delegate_list=DestroyLinkedList(delegate_list,DestroyDelegate);
   instantiate_delegate=MagickFalse;
-  RelinquishSemaphoreInfo(delegate_semaphore);
+  UnlockSemaphoreInfo(delegate_semaphore);
   DestroySemaphoreInfo(&delegate_semaphore);
 }
 
@@ -379,7 +381,7 @@
   /*
     Search for named delegate.
   */
-  AcquireSemaphoreInfo(&delegate_semaphore);
+  LockSemaphoreInfo(delegate_semaphore);
   ResetLinkedListIterator(delegate_list);
   p=(const DelegateInfo *) GetNextValueInLinkedList(delegate_list);
   while (p != (const DelegateInfo *) NULL)
@@ -412,7 +414,7 @@
   if (p != (const DelegateInfo *) NULL)
     (void) InsertValueInLinkedList(delegate_list,0,
       RemoveElementByValueFromLinkedList(delegate_list,p));
-  RelinquishSemaphoreInfo(delegate_semaphore);
+  UnlockSemaphoreInfo(delegate_semaphore);
   return(p);
 }
 
@@ -503,7 +505,7 @@
   /*
     Generate delegate list.
   */
-  AcquireSemaphoreInfo(&delegate_semaphore);
+  LockSemaphoreInfo(delegate_semaphore);
   ResetLinkedListIterator(delegate_list);
   p=(const DelegateInfo *) GetNextValueInLinkedList(delegate_list);
   for (i=0; p != (const DelegateInfo *) NULL; )
@@ -514,7 +516,7 @@
       delegates[i++]=p;
     p=(const DelegateInfo *) GetNextValueInLinkedList(delegate_list);
   }
-  RelinquishSemaphoreInfo(delegate_semaphore);
+  UnlockSemaphoreInfo(delegate_semaphore);
   qsort((void *) delegates,(size_t) i,sizeof(*delegates),DelegateInfoCompare);
   delegates[i]=(DelegateInfo *) NULL;
   *number_delegates=(unsigned long) i;
@@ -596,7 +598,7 @@
     GetNumberOfElementsInLinkedList(delegate_list)+1UL,sizeof(*delegates));
   if (delegates == (char **) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&delegate_semaphore);
+  LockSemaphoreInfo(delegate_semaphore);
   ResetLinkedListIterator(delegate_list);
   p=(const DelegateInfo *) GetNextValueInLinkedList(delegate_list);
   for (i=0; p != (const DelegateInfo *) NULL; )
@@ -609,7 +611,7 @@
       delegates[i++]=ConstantString(p->encode);
     p=(const DelegateInfo *) GetNextValueInLinkedList(delegate_list);
   }
-  RelinquishSemaphoreInfo(delegate_semaphore);
+  UnlockSemaphoreInfo(delegate_semaphore);
   qsort((void *) delegates,(size_t) i,sizeof(*delegates),DelegateCompare);
   delegates[i]=(char *) NULL;
   *number_delegates=(unsigned long) i;
@@ -707,13 +709,14 @@
       (instantiate_delegate == MagickFalse))
     {
       AcquireSemaphoreInfo(&delegate_semaphore);
+      LockSemaphoreInfo(delegate_semaphore);
       if ((delegate_list == (LinkedListInfo *) NULL) &&
           (instantiate_delegate == MagickFalse))
         {
           (void) LoadDelegateLists(DelegateFilename,exception);
           instantiate_delegate=MagickTrue;
         }
-      RelinquishSemaphoreInfo(delegate_semaphore);
+      UnlockSemaphoreInfo(delegate_semaphore);
     }
   return(delegate_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
 }
diff --git a/magick/deprecate.c b/magick/deprecate.c
index 4e29df0..c3b337c 100644
--- a/magick/deprecate.c
+++ b/magick/deprecate.c
@@ -3758,7 +3758,7 @@
 MagickExport void LiberateSemaphoreInfo(SemaphoreInfo **semaphore_info)
 {
   (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
-  RelinquishSemaphoreInfo(*semaphore_info);
+  UnlockSemaphoreInfo(*semaphore_info);
 }
 
 /*
diff --git a/magick/exception.c b/magick/exception.c
index bd542b9..d1d2351 100644
--- a/magick/exception.c
+++ b/magick/exception.c
@@ -158,7 +158,7 @@
   assert(exception->signature == MagickSignature);
   if (exception->exceptions  == (void *) NULL)
     return;
-  AcquireSemaphoreInfo(&exception->semaphore);
+  LockSemaphoreInfo(exception->semaphore);
   p=(ExceptionInfo *) RemoveLastElementFromLinkedList((LinkedListInfo *)
     exception->exceptions);
   while (p != (ExceptionInfo *) NULL)
@@ -170,7 +170,7 @@
   exception->severity=UndefinedException;
   exception->reason=(char *) NULL;
   exception->description=(char *) NULL;
-  RelinquishSemaphoreInfo(exception->semaphore);
+  UnlockSemaphoreInfo(exception->semaphore);
   errno=0;
 }
 
@@ -206,7 +206,7 @@
   assert(exception->signature == MagickSignature);
   if (exception->exceptions  == (void *) NULL)
     return;
-  AcquireSemaphoreInfo(&exception->semaphore);
+  LockSemaphoreInfo(exception->semaphore);
   ResetLinkedListIterator((LinkedListInfo *) exception->exceptions);
   p=(const ExceptionInfo *) GetNextValueInLinkedList((LinkedListInfo *)
     exception->exceptions);
@@ -221,7 +221,7 @@
     p=(const ExceptionInfo *) GetNextValueInLinkedList((LinkedListInfo *)
       exception->exceptions);
   }
-  RelinquishSemaphoreInfo(exception->semaphore);
+  UnlockSemaphoreInfo(exception->semaphore);
   ClearMagickException(exception);
 }
 
@@ -378,7 +378,7 @@
 
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  AcquireSemaphoreInfo(&exception->semaphore);
+  LockSemaphoreInfo(exception->semaphore);
   exception->severity=UndefinedException;
   if (exception->exceptions != (void *) NULL)
     exception->exceptions=(void *) DestroyLinkedList((LinkedListInfo *)
@@ -386,7 +386,7 @@
   relinquish=exception->relinquish;
   if (exception->relinquish != MagickFalse)
     exception->signature=(~MagickSignature);
-  RelinquishSemaphoreInfo(exception->semaphore);
+  UnlockSemaphoreInfo(exception->semaphore);
   DestroySemaphoreInfo(&exception->semaphore);
   if (relinquish != MagickFalse)
     exception=(ExceptionInfo *) RelinquishMagickMemory(exception);
@@ -421,6 +421,7 @@
   (void) ResetMagickMemory(exception,0,sizeof(*exception));
   exception->severity=UndefinedException;
   exception->exceptions=(void *) NewLinkedList(0);
+  exception->semaphore=AllocateSemaphoreInfo();
   exception->signature=MagickSignature;
 }
 
@@ -612,7 +613,7 @@
   assert(relative->signature == MagickSignature);
   if (relative->exceptions == (void *) NULL)
     return;
-  AcquireSemaphoreInfo(&exception->semaphore);
+  LockSemaphoreInfo(exception->semaphore);
   ResetLinkedListIterator((LinkedListInfo *) relative->exceptions);
   p=(const ExceptionInfo *) GetNextValueInLinkedList((LinkedListInfo *)
     relative->exceptions);
@@ -622,7 +623,7 @@
     p=(const ExceptionInfo *) GetNextValueInLinkedList((LinkedListInfo *)
       relative->exceptions);
   }
-  RelinquishSemaphoreInfo(exception->semaphore);
+  UnlockSemaphoreInfo(exception->semaphore);
 }
 
 /*
diff --git a/magick/gem.c b/magick/gem.c
index a53427c..eeb53ef 100644
--- a/magick/gem.c
+++ b/magick/gem.c
@@ -372,20 +372,16 @@
   *brightness=(double) (QuantumScale*max);
   if (delta == 0.0)
     return;
-  if (red == max)
-    *hue=((((max-blue)/6.0)+(delta/2.0))-(((max-green)/6.0)+(delta/2.0)))/delta;
+  if ((MagickRealType) red == max)
+    *hue=(double) ((green-(MagickRealType) blue)/delta);
   else
-    if (green == max)
-      *hue=(1.0/3.0)+((((max-red)/6.0)+(delta/2.0))-(((max-blue)/6.0)+
-        (delta/2.0)))/delta;
+    if ((MagickRealType) green == max)
+      *hue=(double) (2.0+(blue-(MagickRealType) red)/delta);
     else
-      if (blue == max)
-        *hue=(2.0/3.0)+((((max-green)/6.0)+(delta/2.0))-(((max-red)/6.0)+
-          (delta/2.0)))/delta;
+      *hue=(double) (4.0+(red-(MagickRealType) green)/delta);
+  *hue/=6.0;
   if (*hue < 0.0)
     *hue+=1.0;
-  if (*hue > 1.0)
-    *hue-=1.0;
 }
 
 /*
diff --git a/magick/image.c b/magick/image.c
index 709c64a..7bda14a 100644
--- a/magick/image.c
+++ b/magick/image.c
@@ -1627,9 +1627,9 @@
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  AcquireSemaphoreInfo(&image->semaphore);
+  LockSemaphoreInfo(image->semaphore);
   reference_count=image->reference_count;
-  RelinquishSemaphoreInfo(image->semaphore);
+  UnlockSemaphoreInfo(image->semaphore);
   return(reference_count);
 }
 
@@ -2066,9 +2066,9 @@
   if (GetImageReferenceCount(*image) <= 1)
     return(MagickTrue);
   clone_image=CloneImage(*image,0,0,MagickTrue,exception);
-  AcquireSemaphoreInfo(&(*image)->semaphore);
+  LockSemaphoreInfo((*image)->semaphore);
   (*image)->reference_count--;
-  RelinquishSemaphoreInfo((*image)->semaphore);
+  UnlockSemaphoreInfo((*image)->semaphore);
   *image=clone_image;
   return(MagickTrue);
 }
diff --git a/magick/locale.c b/magick/locale.c
index 5fa0dc2..cf4dda9 100644
--- a/magick/locale.c
+++ b/magick/locale.c
@@ -254,7 +254,7 @@
   /*
     Generate locale list.
   */
-  AcquireSemaphoreInfo(&locale_semaphore);
+  LockSemaphoreInfo(locale_semaphore);
   ResetSplayTreeIterator(locale_list);
   p=(const LocaleInfo *) GetNextValueInSplayTree(locale_list);
   for (i=0; p != (const LocaleInfo *) NULL; )
@@ -264,7 +264,7 @@
       messages[i++]=p;
     p=(const LocaleInfo *) GetNextValueInSplayTree(locale_list);
   }
-  RelinquishSemaphoreInfo(locale_semaphore);
+  UnlockSemaphoreInfo(locale_semaphore);
   qsort((void *) messages,(size_t) i,sizeof(*messages),LocaleInfoCompare);
   messages[i]=(LocaleInfo *) NULL;
   *number_messages=(unsigned long) i;
@@ -342,13 +342,11 @@
   p=GetLocaleInfo_("*",exception);
   if (p == (const LocaleInfo *) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&locale_semaphore);
-  RelinquishSemaphoreInfo(locale_semaphore);
   messages=(char **) AcquireQuantumMemory((size_t)
     GetNumberOfNodesInSplayTree(locale_list)+1UL,sizeof(*messages));
   if (messages == (char **) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&locale_semaphore);
+  LockSemaphoreInfo(locale_semaphore);
   p=(const LocaleInfo *) GetNextValueInSplayTree(locale_list);
   for (i=0; p != (const LocaleInfo *) NULL; )
   {
@@ -357,7 +355,7 @@
       messages[i++]=ConstantString(p->tag);
     p=(const LocaleInfo *) GetNextValueInSplayTree(locale_list);
   }
-  RelinquishSemaphoreInfo(locale_semaphore);
+  UnlockSemaphoreInfo(locale_semaphore);
   qsort((void *) messages,(size_t) i,sizeof(*messages),LocaleTagCompare);
   messages[i]=(char *) NULL;
   *number_messages=(unsigned long) i;
@@ -552,6 +550,7 @@
       (instantiate_locale == MagickFalse))
     {
       AcquireSemaphoreInfo(&locale_semaphore);
+      LockSemaphoreInfo(locale_semaphore);
       if ((locale_list == (SplayTreeInfo *) NULL) &&
           (instantiate_locale == MagickFalse))
         {
@@ -579,7 +578,7 @@
           locale=DestroyString(locale);
           instantiate_locale=MagickTrue;
         }
-      RelinquishSemaphoreInfo(locale_semaphore);
+      UnlockSemaphoreInfo(locale_semaphore);
     }
   return(locale_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -1048,8 +1047,8 @@
 */
 MagickExport MagickBooleanType LocaleComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&locale_semaphore);
-  RelinquishSemaphoreInfo(locale_semaphore);
+  assert(locale_semaphore == (SemaphoreInfo *) NULL);
+  locale_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -1073,10 +1072,12 @@
 */
 MagickExport void LocaleComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&locale_semaphore);
+  if (locale_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&locale_semaphore);
+  LockSemaphoreInfo(locale_semaphore);
   if (locale_list != (SplayTreeInfo *) NULL)
     locale_list=DestroySplayTree(locale_list);
   instantiate_locale=MagickFalse;
-  RelinquishSemaphoreInfo(locale_semaphore);
+  UnlockSemaphoreInfo(locale_semaphore);
   DestroySemaphoreInfo(&locale_semaphore);
 }
diff --git a/magick/log.c b/magick/log.c
index 05429e9..dad845b 100644
--- a/magick/log.c
+++ b/magick/log.c
@@ -225,7 +225,7 @@
   exception=AcquireExceptionInfo();
   log_info=GetLogInfo("*",exception);
   exception=DestroyExceptionInfo(exception);
-  AcquireSemaphoreInfo(&log_semaphore);
+  LockSemaphoreInfo(log_semaphore);
   if (log_info->file != (FILE *) NULL)
     {
       if (log_info->append == MagickFalse)
@@ -233,7 +233,7 @@
       (void) fclose(log_info->file);
       log_info->file=(FILE *) NULL;
     }
-  RelinquishSemaphoreInfo(log_semaphore);
+  UnlockSemaphoreInfo(log_semaphore);
 }
 
 /*
@@ -278,7 +278,7 @@
   /*
     Search for log tag.
   */
-  AcquireSemaphoreInfo(&log_semaphore);
+  LockSemaphoreInfo(log_semaphore);
   ResetLinkedListIterator(log_list);
   p=(LogInfo *) GetNextValueInLinkedList(log_list);
   while (p != (LogInfo *) NULL)
@@ -290,7 +290,7 @@
   if (p != (LogInfo *) NULL)
     (void) InsertValueInLinkedList(log_list,0,
       RemoveElementByValueFromLinkedList(log_list,p));
-  RelinquishSemaphoreInfo(log_semaphore);
+  UnlockSemaphoreInfo(log_semaphore);
   return(p);
 }
 
@@ -371,7 +371,7 @@
   /*
     Generate log list.
   */
-  AcquireSemaphoreInfo(&log_semaphore);
+  LockSemaphoreInfo(log_semaphore);
   ResetLinkedListIterator(log_list);
   p=(const LogInfo *) GetNextValueInLinkedList(log_list);
   for (i=0; p != (const LogInfo *) NULL; )
@@ -381,7 +381,7 @@
       preferences[i++]=p;
     p=(const LogInfo *) GetNextValueInLinkedList(log_list);
   }
-  RelinquishSemaphoreInfo(log_semaphore);
+  UnlockSemaphoreInfo(log_semaphore);
   qsort((void *) preferences,(size_t) i,sizeof(*preferences),LogInfoCompare);
   preferences[i]=(LogInfo *) NULL;
   *number_preferences=(unsigned long) i;
@@ -464,7 +464,7 @@
   /*
     Generate log list.
   */
-  AcquireSemaphoreInfo(&log_semaphore);
+  LockSemaphoreInfo(log_semaphore);
   ResetLinkedListIterator(log_list);
   p=(const LogInfo *) GetNextValueInLinkedList(log_list);
   for (i=0; p != (const LogInfo *) NULL; )
@@ -474,7 +474,7 @@
       preferences[i++]=ConstantString(p->name);
     p=(const LogInfo *) GetNextValueInLinkedList(log_list);
   }
-  RelinquishSemaphoreInfo(log_semaphore);
+  UnlockSemaphoreInfo(log_semaphore);
   qsort((void *) preferences,(size_t) i,sizeof(*preferences),LogCompare);
   preferences[i]=(char *) NULL;
   *number_preferences=(unsigned long) i;
@@ -531,13 +531,14 @@
   if ((log_list == (LinkedListInfo *) NULL) && (instantiate_log == MagickFalse))
     {
       AcquireSemaphoreInfo(&log_semaphore);
+      LockSemaphoreInfo(log_semaphore);
       if ((log_list == (LinkedListInfo *) NULL) &&
           (instantiate_log == MagickFalse))
         {
           (void) LoadLogLists(LogFilename,exception);
           instantiate_log=MagickTrue;
         }
-      RelinquishSemaphoreInfo(log_semaphore);
+      UnlockSemaphoreInfo(log_semaphore);
     }
   return(log_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -682,8 +683,8 @@
 */
 MagickExport MagickBooleanType LogComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&log_semaphore);
-  RelinquishSemaphoreInfo(log_semaphore);
+  assert(log_semaphore == (SemaphoreInfo *) NULL);
+  log_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -734,11 +735,13 @@
 
 MagickExport void LogComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&log_semaphore);
+  if (log_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&log_semaphore);
+  LockSemaphoreInfo(log_semaphore);
   if (log_list != (LinkedListInfo *) NULL)
     log_list=DestroyLinkedList(log_list,DestroyLogElement);
   instantiate_log=MagickFalse;
-  RelinquishSemaphoreInfo(log_semaphore);
+  UnlockSemaphoreInfo(log_semaphore);
   DestroySemaphoreInfo(&log_semaphore);
 }
 
@@ -1123,10 +1126,10 @@
   exception=AcquireExceptionInfo();
   log_info=(LogInfo *) GetLogInfo("*",exception);
   exception=DestroyExceptionInfo(exception);
-  AcquireSemaphoreInfo(&log_semaphore);
+  LockSemaphoreInfo(log_semaphore);
   if ((log_info->event_mask & type) == 0)
     {
-      RelinquishSemaphoreInfo(log_semaphore);
+      UnlockSemaphoreInfo(log_semaphore);
       return(MagickTrue);
     }
   domain=MagickOptionToMnemonic(MagickLogEventOptions,type);
@@ -1141,7 +1144,7 @@
   if (text == (char *) NULL)
     {
       (void) ContinueTimer((TimerInfo *) &log_info->timer);
-      RelinquishSemaphoreInfo(log_semaphore);
+      UnlockSemaphoreInfo(log_semaphore);
       return(MagickFalse);
     }
   if ((log_info->handler_mask & ConsoleHandler) != 0)
@@ -1184,7 +1187,7 @@
           if (filename == (char *) NULL)
             {
               (void) ContinueTimer((TimerInfo *) &log_info->timer);
-              RelinquishSemaphoreInfo(log_semaphore);
+              UnlockSemaphoreInfo(log_semaphore);
               return(MagickFalse);
             }
           log_info->append=IsPathAccessible(filename);
@@ -1192,7 +1195,7 @@
           filename=(char  *) RelinquishMagickMemory(filename);
           if (log_info->file == (FILE *) NULL)
             {
-              RelinquishSemaphoreInfo(log_semaphore);
+              UnlockSemaphoreInfo(log_semaphore);
               return(MagickFalse);
             }
           log_info->generation++;
@@ -1218,7 +1221,7 @@
     }
   text=(char  *) RelinquishMagickMemory(text);
   (void) ContinueTimer((TimerInfo *) &log_info->timer);
-  RelinquishSemaphoreInfo(log_semaphore);
+  UnlockSemaphoreInfo(log_semaphore);
   return(MagickTrue);
 }
 
@@ -1681,12 +1684,12 @@
   log_info=(LogInfo *) GetLogInfo("*",exception);
   exception=DestroyExceptionInfo(exception);
   option=ParseMagickOption(MagickLogEventOptions,MagickTrue,events);
-  AcquireSemaphoreInfo(&log_semaphore);
+  LockSemaphoreInfo(log_semaphore);
   log_info=(LogInfo *) GetValueFromLinkedList(log_list,0);
   log_info->event_mask=(LogEventType) option;
   if (option == -1)
     log_info->event_mask=UndefinedEvents;
-  RelinquishSemaphoreInfo(log_semaphore);
+  UnlockSemaphoreInfo(log_semaphore);
   return(log_info->event_mask);
 }
 
@@ -1723,11 +1726,11 @@
   exception=AcquireExceptionInfo();
   log_info=(LogInfo *) GetLogInfo("*",exception);
   exception=DestroyExceptionInfo(exception);
-  AcquireSemaphoreInfo(&log_semaphore);
+  LockSemaphoreInfo(log_semaphore);
   if (log_info->format != (char *) NULL)
     log_info->format=DestroyString(log_info->format);
   log_info->format=ConstantString(format);
-  RelinquishSemaphoreInfo(log_semaphore);
+  UnlockSemaphoreInfo(log_semaphore);
 }
 
 /*
diff --git a/magick/magic.c b/magick/magic.c
index 0ef4c87..83f290a 100644
--- a/magick/magic.c
+++ b/magick/magic.c
@@ -259,7 +259,7 @@
   /*
     Search for magic tag.
   */
-  AcquireSemaphoreInfo(&magic_semaphore);
+  LockSemaphoreInfo(magic_semaphore);
   ResetLinkedListIterator(magic_list);
   p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
   while (p != (const MagicInfo *) NULL)
@@ -273,7 +273,7 @@
   if (p != (const MagicInfo *) NULL)
     (void) InsertValueInLinkedList(magic_list,0,
       RemoveElementByValueFromLinkedList(magic_list,p));
-  RelinquishSemaphoreInfo(magic_semaphore);
+  UnlockSemaphoreInfo(magic_semaphore);
   return(p);
 }
 
@@ -356,7 +356,7 @@
   /*
     Generate magic list.
   */
-  AcquireSemaphoreInfo(&magic_semaphore);
+  LockSemaphoreInfo(magic_semaphore);
   ResetLinkedListIterator(magic_list);
   p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
   for (i=0; p != (const MagicInfo *) NULL; )
@@ -366,7 +366,7 @@
       aliases[i++]=p;
     p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
   }
-  RelinquishSemaphoreInfo(magic_semaphore);
+  UnlockSemaphoreInfo(magic_semaphore);
   qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicInfoCompare);
   aliases[i]=(MagicInfo *) NULL;
   *number_aliases=(unsigned long) i;
@@ -448,7 +448,7 @@
     GetNumberOfElementsInLinkedList(magic_list)+1UL,sizeof(*aliases));
   if (aliases == (char **) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&magic_semaphore);
+  LockSemaphoreInfo(magic_semaphore);
   ResetLinkedListIterator(magic_list);
   p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
   for (i=0; p != (const MagicInfo *) NULL; )
@@ -458,7 +458,7 @@
       aliases[i++]=ConstantString(p->name);
     p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
   }
-  RelinquishSemaphoreInfo(magic_semaphore);
+  UnlockSemaphoreInfo(magic_semaphore);
   qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicCompare);
   aliases[i]=(char *) NULL;
   *number_aliases=(unsigned long) i;
@@ -523,13 +523,14 @@
       (instantiate_magic == MagickFalse))
     {
       AcquireSemaphoreInfo(&magic_semaphore);
+      LockSemaphoreInfo(magic_semaphore);
       if ((magic_list == (LinkedListInfo *) NULL) &&
           (instantiate_magic == MagickFalse))
         {
           (void) LoadMagicLists(MagicFilename,exception);
           instantiate_magic=MagickTrue;
         }
-      RelinquishSemaphoreInfo(magic_semaphore);
+      UnlockSemaphoreInfo(magic_semaphore);
     }
   return(magic_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -1010,8 +1011,8 @@
 */
 MagickExport MagickBooleanType MagicComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&magic_semaphore);
-  RelinquishSemaphoreInfo(magic_semaphore);
+  assert(magic_semaphore == (SemaphoreInfo *) NULL);
+  magic_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -1057,10 +1058,12 @@
 
 MagickExport void MagicComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&magic_semaphore);
+  if (magic_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&magic_semaphore);
+  LockSemaphoreInfo(magic_semaphore);
   if (magic_list != (LinkedListInfo *) NULL)
     magic_list=DestroyLinkedList(magic_list,DestroyMagicElement);
   instantiate_magic=MagickFalse;
-  RelinquishSemaphoreInfo(magic_semaphore);
+  UnlockSemaphoreInfo(magic_semaphore);
   DestroySemaphoreInfo(&magic_semaphore);
 }
diff --git a/magick/magick.c b/magick/magick.c
index 678330c..4ea2961 100644
--- a/magick/magick.c
+++ b/magick/magick.c
@@ -228,7 +228,7 @@
   if (p == (const MagickInfo *) NULL)
     return(MagickFalse);
   status=MagickFalse;
-  AcquireSemaphoreInfo(&magick_semaphore);
+  LockSemaphoreInfo(magick_semaphore);
   ResetSplayTreeIterator(magick_list);
   p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   while (p != (const MagickInfo *) NULL)
@@ -242,7 +242,7 @@
       }
     p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   }
-  RelinquishSemaphoreInfo(magick_semaphore);
+  UnlockSemaphoreInfo(magick_semaphore);
   return(status);
 }
 
@@ -412,16 +412,16 @@
       if (LocaleCompare(name,"*") == 0)
         (void) OpenModules(exception);
 #endif
-      AcquireSemaphoreInfo(&magick_semaphore);
+      LockSemaphoreInfo(magick_semaphore);
       ResetSplayTreeIterator(magick_list);
       p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
-      RelinquishSemaphoreInfo(magick_semaphore);
+      UnlockSemaphoreInfo(magick_semaphore);
       return(p);
     }
   /*
     Find name in list.
   */
-  AcquireSemaphoreInfo(&magick_semaphore);
+  LockSemaphoreInfo(magick_semaphore);
   ResetSplayTreeIterator(magick_list);
   p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   while (p != (const MagickInfo *) NULL)
@@ -445,7 +445,7 @@
       }
     }
 #endif
-  RelinquishSemaphoreInfo(magick_semaphore);
+  UnlockSemaphoreInfo(magick_semaphore);
   return(p);
 }
 
@@ -526,7 +526,7 @@
   /*
     Generate magick list.
   */
-  AcquireSemaphoreInfo(&magick_semaphore);
+  LockSemaphoreInfo(magick_semaphore);
   ResetSplayTreeIterator(magick_list);
   p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   for (i=0; p != (const MagickInfo *) NULL; )
@@ -536,7 +536,7 @@
       formats[i++]=p;
     p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   }
-  RelinquishSemaphoreInfo(magick_semaphore);
+  UnlockSemaphoreInfo(magick_semaphore);
   qsort((void *) formats,(size_t) i,sizeof(*formats),MagickInfoCompare);
   formats[i]=(MagickInfo *) NULL;
   *number_formats=(unsigned long) i;
@@ -616,7 +616,7 @@
     GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
   if (formats == (char **) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&magick_semaphore);
+  LockSemaphoreInfo(magick_semaphore);
   ResetSplayTreeIterator(magick_list);
   p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   for (i=0; p != (const MagickInfo *) NULL; )
@@ -626,7 +626,7 @@
       formats[i++]=ConstantString(p->name);
     p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   }
-  RelinquishSemaphoreInfo(magick_semaphore);
+  UnlockSemaphoreInfo(magick_semaphore);
   qsort((void *) formats,(size_t) i,sizeof(*formats),MagickCompare);
   formats[i]=(char *) NULL;
   *number_formats=(unsigned long) i;
@@ -776,6 +776,7 @@
       (instantiate_magick == MagickFalse))
     {
       AcquireSemaphoreInfo(&magick_semaphore);
+      LockSemaphoreInfo(magick_semaphore);
       if ((magick_list == (SplayTreeInfo *) NULL) &&
           (instantiate_magick == MagickFalse))
         {
@@ -817,7 +818,7 @@
 #endif
           instantiate_magick=MagickTrue;
         }
-      RelinquishSemaphoreInfo(magick_semaphore);
+      UnlockSemaphoreInfo(magick_semaphore);
     }
   return(magick_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -1029,8 +1030,8 @@
 */
 MagickExport MagickBooleanType MagickComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&magick_semaphore);
-  RelinquishSemaphoreInfo(magick_semaphore);
+  assert(magick_semaphore == (SemaphoreInfo *) NULL);
+  magick_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -1054,11 +1055,13 @@
 */
 MagickExport void MagickComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&magick_semaphore);
+  if (magick_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&magick_semaphore);
+  LockSemaphoreInfo(magick_semaphore);
   if (magick_list != (SplayTreeInfo *) NULL)
     magick_list=DestroySplayTree(magick_list);
   instantiate_magick=MagickFalse;
-  RelinquishSemaphoreInfo(magick_semaphore);
+  UnlockSemaphoreInfo(magick_semaphore);
   DestroySemaphoreInfo(&magick_semaphore);
 }
 
@@ -1261,6 +1264,7 @@
   /*
     Instantiate magick resources.
   */
+  (void) ConfigureComponentGenesis();
   (void) PolicyComponentGenesis();
   (void) CacheComponentGenesis();
   (void) RegistryComponentGenesis();
@@ -1274,7 +1278,6 @@
   (void) MagicComponentGenesis();
   (void) ColorComponentGenesis();
   (void) TypeComponentGenesis();
-  (void) ConfigureComponentGenesis();
   (void) MimeComponentGenesis();
   (void) ConstituteComponentGenesis();
   (void) XComponentGenesis();
@@ -1305,7 +1308,6 @@
 #endif
   ConstituteComponentTerminus();
   MimeComponentTerminus();
-  ConfigureComponentTerminus();
   TypeComponentTerminus();
   ColorComponentTerminus();
 #if defined(__WINDOWS__)
@@ -1325,6 +1327,7 @@
   RegistryComponentTerminus();
   CacheComponentTerminus();
   PolicyComponentTerminus();
+  ConfigureComponentTerminus();
   RandomComponentTerminus();
   LocaleComponentTerminus();
   LogComponentTerminus();
@@ -1461,7 +1464,7 @@
     return(MagickFalse);
   if (GetNumberOfNodesInSplayTree(magick_list) == 0)
     return(MagickFalse);
-  AcquireSemaphoreInfo(&magick_semaphore);
+  LockSemaphoreInfo(magick_semaphore);
   ResetSplayTreeIterator(magick_list);
   p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   while (p != (const MagickInfo *) NULL)
@@ -1471,6 +1474,6 @@
     p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
   }
   status=DeleteNodeByValueFromSplayTree(magick_list,p);
-  RelinquishSemaphoreInfo(magick_semaphore);
+  UnlockSemaphoreInfo(magick_semaphore);
   return(status);
 }
diff --git a/magick/memory.c b/magick/memory.c
index 095c195..26f29ff 100644
--- a/magick/memory.c
+++ b/magick/memory.c
@@ -391,7 +391,7 @@
 #else
   if (free_segments == (DataSegmentInfo *) NULL)
     {
-      AcquireSemaphoreInfo(&memory_semaphore);
+      LockSemaphoreInfo(memory_semaphore);
       if (free_segments == (DataSegmentInfo *) NULL)
         {
           register long
@@ -411,16 +411,16 @@
           }
           free_segments=(&memory_info.segment_pool[0]);
         }
-      RelinquishSemaphoreInfo(memory_semaphore);
+      UnlockSemaphoreInfo(memory_semaphore);
     }
-  AcquireSemaphoreInfo(&memory_semaphore);
+  LockSemaphoreInfo(memory_semaphore);
   memory=AcquireBlock(size == 0 ? 1UL : size);
   if (memory == (void *) NULL)
     {
       if (ExpandHeap(size == 0 ? 1UL : size) != MagickFalse)
         memory=AcquireBlock(size == 0 ? 1UL : size);
     }
-  RelinquishSemaphoreInfo(memory_semaphore);
+  UnlockSemaphoreInfo(memory_semaphore);
 #endif
   return(memory);
 }
@@ -546,8 +546,8 @@
   register long
     i;
 
-  AcquireSemaphoreInfo(&memory_semaphore);
-  RelinquishSemaphoreInfo(memory_semaphore);
+  LockSemaphoreInfo(memory_semaphore);
+  UnlockSemaphoreInfo(memory_semaphore);
   for (i=0; i < (long) memory_info.number_segments; i++)
     if (memory_info.segments[i]->mapped == MagickFalse)
       memory_methods.destroy_memory_handler(
@@ -742,7 +742,7 @@
 #else
   assert((SizeOfBlock(memory) % (4*sizeof(size_t))) == 0);
   assert((*BlockHeader(NextBlock(memory)) & PreviousBlockBit) != 0);
-  AcquireSemaphoreInfo(&memory_semaphore);
+  LockSemaphoreInfo(memory_semaphore);
   if ((*BlockHeader(memory) & PreviousBlockBit) == 0)
     {
       void
@@ -773,7 +773,7 @@
   *BlockFooter(memory,SizeOfBlock(memory))=SizeOfBlock(memory);
   *BlockHeader(NextBlock(memory))&=(~PreviousBlockBit);
   InsertFreeBlock(memory,AllocationPolicy(SizeOfBlock(memory)));
-  RelinquishSemaphoreInfo(memory_semaphore);
+  UnlockSemaphoreInfo(memory_semaphore);
 #endif
   return((void *) NULL);
 }
@@ -870,20 +870,20 @@
   if (block == (void *) NULL)
     memory=RelinquishMagickMemory(memory);
 #else
-  AcquireSemaphoreInfo(&memory_semaphore);
+  LockSemaphoreInfo(memory_semaphore);
   block=ResizeBlock(memory,size == 0 ? 1UL : size);
   if (block == (void *) NULL)
     {
       if (ExpandHeap(size == 0 ? 1UL : size) == MagickFalse)
         {
-          RelinquishSemaphoreInfo(memory_semaphore);
+          UnlockSemaphoreInfo(memory_semaphore);
           memory=RelinquishMagickMemory(memory);
           ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
         }
       block=ResizeBlock(memory,size == 0 ? 1UL : size);
       assert(block != (void *) NULL);
     }
-  RelinquishSemaphoreInfo(memory_semaphore);
+  UnlockSemaphoreInfo(memory_semaphore);
   memory=RelinquishMagickMemory(memory);
 #endif
   return(block);
diff --git a/magick/mime.c b/magick/mime.c
index 7e151fd..c53b684 100644
--- a/magick/mime.c
+++ b/magick/mime.c
@@ -200,7 +200,7 @@
   */
   mime_info=(const MimeInfo *) NULL;
   lsb_first=1;
-  AcquireSemaphoreInfo(&mime_semaphore);
+  LockSemaphoreInfo(mime_semaphore);
   ResetLinkedListIterator(mime_list);
   p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   while (p != (const MimeInfo *) NULL)
@@ -324,7 +324,7 @@
   if (p != (const MimeInfo *) NULL)
     (void) InsertValueInLinkedList(mime_list,0,
       RemoveElementByValueFromLinkedList(mime_list,p));
-  RelinquishSemaphoreInfo(mime_semaphore);
+  UnlockSemaphoreInfo(mime_semaphore);
   return(mime_info);
 }
 
@@ -408,7 +408,7 @@
   /*
     Generate mime list.
   */
-  AcquireSemaphoreInfo(&mime_semaphore);
+  LockSemaphoreInfo(mime_semaphore);
   ResetLinkedListIterator(mime_list);
   p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   for (i=0; p != (const MimeInfo *) NULL; )
@@ -418,7 +418,7 @@
       aliases[i++]=p;
     p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   }
-  RelinquishSemaphoreInfo(mime_semaphore);
+  UnlockSemaphoreInfo(mime_semaphore);
   qsort((void *) aliases,(size_t) i,sizeof(*aliases),MimeInfoCompare);
   aliases[i]=(MimeInfo *) NULL;
   *number_aliases=(unsigned long) i;
@@ -500,7 +500,7 @@
     GetNumberOfElementsInLinkedList(mime_list)+1UL,sizeof(*aliases));
   if (aliases == (char **) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&mime_semaphore);
+  LockSemaphoreInfo(mime_semaphore);
   ResetLinkedListIterator(mime_list);
   p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   for (i=0; p != (const MimeInfo *) NULL; )
@@ -510,7 +510,7 @@
       aliases[i++]=ConstantString(p->type);
     p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   }
-  RelinquishSemaphoreInfo(mime_semaphore);
+  UnlockSemaphoreInfo(mime_semaphore);
   qsort((void *) aliases,(size_t) i,sizeof(*aliases),MimeCompare);
   aliases[i]=(char *) NULL;
   *number_aliases=(unsigned long) i;
@@ -605,13 +605,14 @@
       (instantiate_mime == MagickFalse))
     {
       AcquireSemaphoreInfo(&mime_semaphore);
+      LockSemaphoreInfo(mime_semaphore);
       if ((mime_list == (LinkedListInfo *) NULL) &&
           (instantiate_mime == MagickFalse))
         {
           (void) LoadMimeLists(MimeFilename,exception);
           instantiate_mime=MagickTrue;
         }
-      RelinquishSemaphoreInfo(mime_semaphore);
+      UnlockSemaphoreInfo(mime_semaphore);
     }
   return(mime_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -1050,8 +1051,8 @@
 */
 MagickExport MagickBooleanType MimeComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&mime_semaphore);
-  RelinquishSemaphoreInfo(mime_semaphore);
+  assert(mime_semaphore == (SemaphoreInfo *) NULL);
+  mime_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -1096,10 +1097,12 @@
 
 MagickExport void MimeComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&mime_semaphore);
+  if (mime_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&mime_semaphore);
+  LockSemaphoreInfo(mime_semaphore);
   if (mime_list != (LinkedListInfo *) NULL)
     mime_list=DestroyLinkedList(mime_list,DestroyMimeElement);
   instantiate_mime=MagickFalse;
-  RelinquishSemaphoreInfo(mime_semaphore);
+  UnlockSemaphoreInfo(mime_semaphore);
   DestroySemaphoreInfo(&mime_semaphore);
 }
diff --git a/magick/module.c b/magick/module.c
index 4b6203e..ef3785c 100644
--- a/magick/module.c
+++ b/magick/module.c
@@ -175,7 +175,7 @@
   /*
     Destroy magick modules.
   */
-  AcquireSemaphoreInfo(&module_semaphore);
+  LockSemaphoreInfo(module_semaphore);
 #if defined(MAGICKCORE_MODULES_SUPPORT)
   if (module_list != (SplayTreeInfo *) NULL)
     module_list=DestroySplayTree(module_list);
@@ -183,7 +183,7 @@
     (void) lt_dlexit();
 #endif
   instantiate_module=MagickFalse;
-  RelinquishSemaphoreInfo(module_semaphore);
+  UnlockSemaphoreInfo(module_semaphore);
 }
 
 /*
@@ -232,10 +232,10 @@
       if (LocaleCompare(tag,"*") == 0)
         (void) OpenModules(exception);
 #endif
-      AcquireSemaphoreInfo(&module_semaphore);
+      LockSemaphoreInfo(module_semaphore);
       ResetSplayTreeIterator(module_list);
       p=(ModuleInfo *) GetNextValueInSplayTree(module_list);
-      RelinquishSemaphoreInfo(module_semaphore);
+      UnlockSemaphoreInfo(module_semaphore);
       return(p);
     }
   return((ModuleInfo *) GetValueFromSplayTree(module_list,tag));
@@ -319,7 +319,7 @@
   /*
     Generate module list.
   */
-  AcquireSemaphoreInfo(&module_semaphore);
+  LockSemaphoreInfo(module_semaphore);
   ResetSplayTreeIterator(module_list);
   p=(const ModuleInfo *) GetNextValueInSplayTree(module_list);
   for (i=0; p != (const ModuleInfo *) NULL; )
@@ -329,7 +329,7 @@
       modules[i++]=p;
     p=(const ModuleInfo *) GetNextValueInSplayTree(module_list);
   }
-  RelinquishSemaphoreInfo(module_semaphore);
+  UnlockSemaphoreInfo(module_semaphore);
   qsort((void *) modules,(size_t) i,sizeof(*modules),ModuleInfoCompare);
   modules[i]=(ModuleInfo *) NULL;
   *number_modules=(unsigned long) i;
@@ -848,6 +848,7 @@
       (instantiate_module == MagickFalse))
     {
       AcquireSemaphoreInfo(&module_semaphore);
+      LockSemaphoreInfo(module_semaphore);
       if ((module_list == (SplayTreeInfo *) NULL) &&
           (instantiate_module == MagickFalse))
         {
@@ -873,7 +874,7 @@
               "UnableToInitializeModuleLoader");
           instantiate_module=MagickTrue;
         }
-      RelinquishSemaphoreInfo(module_semaphore);
+      UnlockSemaphoreInfo(module_semaphore);
     }
   return(module_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -1105,6 +1106,8 @@
   ExceptionInfo
     *exception;
 
+  assert(module_semaphore == (SemaphoreInfo *) NULL);
+  module_semaphore=AllocateSemaphoreInfo();
   exception=AcquireExceptionInfo();
   InitializeModuleList(exception);
   exception=DestroyExceptionInfo(exception);
@@ -1131,6 +1134,8 @@
 */
 MagickExport void ModuleComponentTerminus(void)
 {
+  if (module_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&module_semaphore);
   DestroyModuleList();
   DestroySemaphoreInfo(&module_semaphore);
 }
diff --git a/magick/policy.c b/magick/policy.c
index fd31a38..0a1d997 100644
--- a/magick/policy.c
+++ b/magick/policy.c
@@ -192,7 +192,7 @@
   /*
     Search for policy tag.
   */
-  AcquireSemaphoreInfo(&policy_semaphore);
+  LockSemaphoreInfo(policy_semaphore);
   ResetLinkedListIterator(policy_list);
   p=(PolicyInfo *) GetNextValueInLinkedList(policy_list);
   while (p != (PolicyInfo *) NULL)
@@ -207,7 +207,7 @@
   else
     (void) InsertValueInLinkedList(policy_list,0,
       RemoveElementByValueFromLinkedList(policy_list,p));
-  RelinquishSemaphoreInfo(policy_semaphore);
+  UnlockSemaphoreInfo(policy_semaphore);
   return(p);
 }
 
@@ -267,7 +267,7 @@
   /*
     Generate policy list.
   */
-  AcquireSemaphoreInfo(&policy_semaphore);
+  LockSemaphoreInfo(policy_semaphore);
   ResetLinkedListIterator(policy_list);
   p=(const PolicyInfo *) GetNextValueInLinkedList(policy_list);
   for (i=0; p != (const PolicyInfo *) NULL; )
@@ -277,7 +277,7 @@
       policies[i++]=p;
     p=(const PolicyInfo *) GetNextValueInLinkedList(policy_list);
   }
-  RelinquishSemaphoreInfo(policy_semaphore);
+  UnlockSemaphoreInfo(policy_semaphore);
   policies[i]=(PolicyInfo *) NULL;
   *number_policies=(unsigned long) i;
   return(policies);
@@ -339,7 +339,7 @@
   /*
     Generate policy list.
   */
-  AcquireSemaphoreInfo(&policy_semaphore);
+  LockSemaphoreInfo(policy_semaphore);
   ResetLinkedListIterator(policy_list);
   p=(const PolicyInfo *) GetNextValueInLinkedList(policy_list);
   for (i=0; p != (const PolicyInfo *) NULL; )
@@ -349,7 +349,7 @@
       policies[i++]=ConstantString(p->name);
     p=(const PolicyInfo *) GetNextValueInLinkedList(policy_list);
   }
-  RelinquishSemaphoreInfo(policy_semaphore);
+  UnlockSemaphoreInfo(policy_semaphore);
   policies[i]=(char *) NULL;
   *number_policies=(unsigned long) i;
   return(policies);
@@ -429,13 +429,14 @@
       (instantiate_policy == MagickFalse))
     {
       AcquireSemaphoreInfo(&policy_semaphore);
+      LockSemaphoreInfo(policy_semaphore);
       if ((policy_list == (LinkedListInfo *) NULL) &&
           (instantiate_policy == MagickFalse))
         {
           (void) LoadPolicyLists(PolicyFilename,exception);
           instantiate_policy=MagickTrue;
         }
-      RelinquishSemaphoreInfo(policy_semaphore);
+      UnlockSemaphoreInfo(policy_semaphore);
     }
   return(policy_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -493,7 +494,7 @@
   if (policy_info == (PolicyInfo *) NULL)
     return(MagickTrue);
   authorized=MagickTrue;
-  AcquireSemaphoreInfo(&policy_semaphore);
+  LockSemaphoreInfo(policy_semaphore);
   ResetLinkedListIterator(policy_list);
   p=(PolicyInfo *) GetNextValueInLinkedList(policy_list);
   while ((p != (PolicyInfo *) NULL) && (authorized != MagickFalse))
@@ -513,7 +514,7 @@
       }
     p=(PolicyInfo *) GetNextValueInLinkedList(policy_list);
   }
-  RelinquishSemaphoreInfo(policy_semaphore);
+  UnlockSemaphoreInfo(policy_semaphore);
   return(authorized);
 }
 
@@ -964,8 +965,8 @@
 */
 MagickExport MagickBooleanType PolicyComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&policy_semaphore);
-  RelinquishSemaphoreInfo(policy_semaphore);
+  assert(policy_semaphore == (SemaphoreInfo *) NULL);
+  policy_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -1011,10 +1012,12 @@
 
 MagickExport void PolicyComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&policy_semaphore);
+  if (policy_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&policy_semaphore);
+  LockSemaphoreInfo(policy_semaphore);
   if (policy_list != (LinkedListInfo *) NULL)
     policy_list=DestroyLinkedList(policy_list,DestroyPolicyElement);
   instantiate_policy=MagickFalse;
-  RelinquishSemaphoreInfo(policy_semaphore);
+  UnlockSemaphoreInfo(policy_semaphore);
   DestroySemaphoreInfo(&policy_semaphore);
 }
diff --git a/magick/random.c b/magick/random.c
index 2500cb6..3cd6075 100644
--- a/magick/random.c
+++ b/magick/random.c
@@ -689,7 +689,7 @@
 %                                                                             %
 %                                                                             %
 %                                                                             %
-+   R a n d o m C o m p o n e n t G e n e s i s                                %
++   R a n d o m C o m p o n e n t G e n e s i s                               %
 %                                                                             %
 %                                                                             %
 %                                                                             %
@@ -704,8 +704,8 @@
 */
 MagickExport MagickBooleanType RandomComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&random_semaphore);
-  RelinquishSemaphoreInfo(random_semaphore);
+  assert(random_semaphore == (SemaphoreInfo *) NULL);
+  random_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -729,8 +729,8 @@
 */
 MagickExport void RandomComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&random_semaphore);
-  (void) UnlockSemaphoreInfo(random_semaphore);
+  if (random_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&random_semaphore);
   DestroySemaphoreInfo(&random_semaphore);
 }
 
diff --git a/magick/registry.c b/magick/registry.c
index 3e850a0..c69ef5e 100644
--- a/magick/registry.c
+++ b/magick/registry.c
@@ -299,8 +299,8 @@
 */
 MagickExport MagickBooleanType RegistryComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&registry_semaphore);
-  RelinquishSemaphoreInfo(registry_semaphore);
+  assert(registry_semaphore == (SemaphoreInfo *) NULL);
+  registry_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -324,13 +324,15 @@
 */
 MagickExport void RegistryComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&registry_semaphore);
+  if (registry_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&registry_semaphore);
+  LockSemaphoreInfo(registry_semaphore);
   if (IsEventLogging() != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   if (registry != (void *) NULL)
     registry=DestroySplayTree(registry);
   instantiate_registry=MagickFalse;
-  RelinquishSemaphoreInfo(registry_semaphore);
+  UnlockSemaphoreInfo(registry_semaphore);
   DestroySemaphoreInfo(&registry_semaphore);
 }
 
@@ -524,6 +526,7 @@
       (instantiate_registry == MagickFalse))
     {
       AcquireSemaphoreInfo(&registry_semaphore);
+      LockSemaphoreInfo(registry_semaphore);
       if ((registry == (SplayTreeInfo *) NULL) &&
           (instantiate_registry == MagickFalse))
         {
@@ -531,7 +534,7 @@
             DestroyRegistryNode);
           instantiate_registry=MagickTrue;
         }
-      RelinquishSemaphoreInfo(registry_semaphore);
+      UnlockSemaphoreInfo(registry_semaphore);
     }
   status=AddValueToSplayTree(registry,ConstantString(key),registry_info);
   return(status);
diff --git a/magick/resource.c b/magick/resource.c
index 727283d..83c61b6 100644
--- a/magick/resource.c
+++ b/magick/resource.c
@@ -159,7 +159,9 @@
 
   status=MagickFalse;
   (void) FormatMagickSize(size,resource_request);
-  AcquireSemaphoreInfo(&resource_semaphore);
+  if (resource_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&resource_semaphore);
+  LockSemaphoreInfo(resource_semaphore);
   switch (type)
   {
     case AreaResource:
@@ -253,7 +255,7 @@
     default:
       break;
   }
-  RelinquishSemaphoreInfo(resource_semaphore);
+  UnlockSemaphoreInfo(resource_semaphore);
   (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s: %s/%s/%s",
     MagickOptionToMnemonic(MagickResourceOptions,(long) type),resource_request,
     resource_current,resource_limit);
@@ -467,11 +469,13 @@
   (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s",path);
   if (file == -1)
     return(file);
-  AcquireSemaphoreInfo(&resource_semaphore);
+  if (resource_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&resource_semaphore);
+  LockSemaphoreInfo(resource_semaphore);
   if (temporary_resources == (SplayTreeInfo *) NULL)
     temporary_resources=NewSplayTree(CompareSplayTreeString,
       RelinquishMagickMemory,DestroyTemporaryResources);
-  RelinquishSemaphoreInfo(resource_semaphore);
+  UnlockSemaphoreInfo(resource_semaphore);
   resource=ConstantString(path);
   (void) AddValueToSplayTree(temporary_resources,resource,resource);
   return(file);
@@ -505,7 +509,7 @@
     resource;
 
   resource=0;
-  AcquireSemaphoreInfo(&resource_semaphore);
+  LockSemaphoreInfo(resource_semaphore);
   switch (type)
   {
     case AreaResource:
@@ -546,7 +550,7 @@
     default:
       break;
   }
-  RelinquishSemaphoreInfo(resource_semaphore);
+  UnlockSemaphoreInfo(resource_semaphore);
   return(resource);
 }
 
@@ -578,7 +582,9 @@
     resource;
 
   resource=0;
-  AcquireSemaphoreInfo(&resource_semaphore);
+  if (resource_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&resource_semaphore);
+  LockSemaphoreInfo(resource_semaphore);
   switch (type)
   {
     case AreaResource:
@@ -619,7 +625,7 @@
     default:
       break;
   }
-  RelinquishSemaphoreInfo(resource_semaphore);
+  UnlockSemaphoreInfo(resource_semaphore);
   return(resource);
 }
 
@@ -660,7 +666,9 @@
 
   if (file == (const FILE *) NULL)
     file=stdout;
-  AcquireSemaphoreInfo(&resource_semaphore);
+  if (resource_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&resource_semaphore);
+  LockSemaphoreInfo(resource_semaphore);
   (void) FormatMagickSize(resource_info.area_limit,area_limit);
   (void) FormatMagickSize(resource_info.memory_limit,memory_limit);
   (void) FormatMagickSize(resource_info.map_limit,map_limit);
@@ -677,7 +685,7 @@
     (unsigned long) resource_info.file_limit,area_limit,memory_limit,map_limit,
     disk_limit,(unsigned long) resource_info.thread_limit,time_limit);
   (void) fflush(file);
-  RelinquishSemaphoreInfo(resource_semaphore);
+  UnlockSemaphoreInfo(resource_semaphore);
   return(MagickTrue);
 }
 
@@ -715,7 +723,9 @@
     resource_request[MaxTextExtent];
 
   (void) FormatMagickSize(size,resource_request);
-  AcquireSemaphoreInfo(&resource_semaphore);
+  if (resource_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&resource_semaphore);
+  LockSemaphoreInfo(resource_semaphore);
   switch (type)
   {
     case AreaResource:
@@ -780,7 +790,7 @@
     default:
       break;
   }
-  RelinquishSemaphoreInfo(resource_semaphore);
+  UnlockSemaphoreInfo(resource_semaphore);
   (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s: %s/%s/%s",
     MagickOptionToMnemonic(MagickResourceOptions,(long) type),resource_request,
     resource_current,resource_limit);
@@ -892,8 +902,8 @@
   /*
     Set Magick resource limits.
   */
-  AcquireSemaphoreInfo(&resource_semaphore);
-  RelinquishSemaphoreInfo(resource_semaphore);
+  assert(resource_semaphore == (SemaphoreInfo *) NULL);
+  resource_semaphore=AllocateSemaphoreInfo();
   pagesize=GetMagickPageSize();
   pages=(-1);
 #if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_PHYS_PAGES)
@@ -1013,12 +1023,14 @@
 */
 MagickExport void ResourceComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&resource_semaphore);
+  if (resource_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&resource_semaphore);
+  LockSemaphoreInfo(resource_semaphore);
   if (temporary_resources != (SplayTreeInfo *) NULL)
     temporary_resources=DestroySplayTree(temporary_resources);
   if (random_info != (RandomInfo *) NULL)
     random_info=DestroyRandomInfo(random_info);
-  RelinquishSemaphoreInfo(resource_semaphore);
+  UnlockSemaphoreInfo(resource_semaphore);
   DestroySemaphoreInfo(&resource_semaphore);
 }
 
@@ -1050,7 +1062,9 @@
 MagickExport MagickBooleanType SetMagickResourceLimit(const ResourceType type,
   const MagickSizeType limit)
 {
-  AcquireSemaphoreInfo(&resource_semaphore);
+  if (resource_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&resource_semaphore);
+  LockSemaphoreInfo(resource_semaphore);
   switch (type)
   {
     case AreaResource:
@@ -1092,6 +1106,6 @@
     default:
       break;
   }
-  RelinquishSemaphoreInfo(resource_semaphore);
+  UnlockSemaphoreInfo(resource_semaphore);
   return(MagickTrue);
 }
diff --git a/magick/semaphore.c b/magick/semaphore.c
index 2af57a3..2b54484 100644
--- a/magick/semaphore.c
+++ b/magick/semaphore.c
@@ -118,7 +118,6 @@
   if (*semaphore_info == (SemaphoreInfo *) NULL)
     *semaphore_info=AllocateSemaphoreInfo();
   UnlockMagickMutex();
-  (void) LockSemaphoreInfo(*semaphore_info);
 }
 
 /*
diff --git a/magick/type.c b/magick/type.c
index f400d59..c08c425 100644
--- a/magick/type.c
+++ b/magick/type.c
@@ -270,7 +270,7 @@
   (void) GetTypeInfo("*",exception);
   if (type_list == (SplayTreeInfo *) NULL)
     return((TypeInfo *) NULL);
-  AcquireSemaphoreInfo(&type_semaphore);
+  LockSemaphoreInfo(type_semaphore);
   ResetSplayTreeIterator(type_list);
   type_info=(const TypeInfo *) NULL;
   p=(const TypeInfo *) GetNextValueInSplayTree(type_list);
@@ -315,14 +315,14 @@
     type_info=p;
     break;
   }
-  RelinquishSemaphoreInfo(type_semaphore);
+  UnlockSemaphoreInfo(type_semaphore);
   if (type_info != (const TypeInfo *) NULL)
     return(type_info);
   /*
     Check for types in the same family.
   */
   max_score=0;
-  AcquireSemaphoreInfo(&type_semaphore);
+  LockSemaphoreInfo(type_semaphore);
   ResetSplayTreeIterator(type_list);
   p=(const TypeInfo *) GetNextValueInSplayTree(type_list);
   while (p != (const TypeInfo *) NULL)
@@ -374,7 +374,7 @@
       }
     p=(const TypeInfo *) GetNextValueInSplayTree(type_list);
   }
-  RelinquishSemaphoreInfo(type_semaphore);
+  UnlockSemaphoreInfo(type_semaphore);
   if (type_info != (const TypeInfo *) NULL)
     return(type_info);
   /*
@@ -485,7 +485,7 @@
   /*
     Generate type list.
   */
-  AcquireSemaphoreInfo(&type_semaphore);
+  LockSemaphoreInfo(type_semaphore);
   ResetSplayTreeIterator(type_list);
   p=(const TypeInfo *) GetNextValueInSplayTree(type_list);
   for (i=0; p != (const TypeInfo *) NULL; )
@@ -495,7 +495,7 @@
       fonts[i++]=p;
     p=(const TypeInfo *) GetNextValueInSplayTree(type_list);
   }
-  RelinquishSemaphoreInfo(type_semaphore);
+  UnlockSemaphoreInfo(type_semaphore);
   qsort((void *) fonts,(size_t) i,sizeof(*fonts),TypeInfoCompare);
   fonts[i]=(TypeInfo *) NULL;
   *number_fonts=(unsigned long) i;
@@ -578,7 +578,7 @@
   /*
     Generate type list.
   */
-  AcquireSemaphoreInfo(&type_semaphore);
+  LockSemaphoreInfo(type_semaphore);
   ResetSplayTreeIterator(type_list);
   p=(const TypeInfo *) GetNextValueInSplayTree(type_list);
   for (i=0; p != (const TypeInfo *) NULL; )
@@ -588,7 +588,7 @@
       fonts[i++]=ConstantString(p->name);
     p=(const TypeInfo *) GetNextValueInSplayTree(type_list);
   }
-  RelinquishSemaphoreInfo(type_semaphore);
+  UnlockSemaphoreInfo(type_semaphore);
   qsort((void *) fonts,(size_t) i,sizeof(*fonts),TypeCompare);
   fonts[i]=(char *) NULL;
   *number_fonts=(unsigned long) i;
@@ -772,6 +772,7 @@
       (instantiate_type == MagickFalse))
     {
       AcquireSemaphoreInfo(&type_semaphore);
+      LockSemaphoreInfo(type_semaphore);
       if ((type_list == (SplayTreeInfo *) NULL) &&
           (instantiate_type == MagickFalse))
         {
@@ -784,7 +785,7 @@
 #endif
           instantiate_type=MagickTrue;
         }
-      RelinquishSemaphoreInfo(type_semaphore);
+      UnlockSemaphoreInfo(type_semaphore);
     }
   return(type_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -1342,8 +1343,8 @@
 */
 MagickExport MagickBooleanType TypeComponentGenesis(void)
 {
-  AcquireSemaphoreInfo(&type_semaphore);
-  RelinquishSemaphoreInfo(type_semaphore);
+  assert(type_semaphore == (SemaphoreInfo *) NULL);
+  type_semaphore=AllocateSemaphoreInfo();
   return(MagickTrue);
 }
 
@@ -1367,10 +1368,12 @@
 */
 MagickExport void TypeComponentTerminus(void)
 {
-  AcquireSemaphoreInfo(&type_semaphore);
+  if (type_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&type_semaphore);
+  LockSemaphoreInfo(type_semaphore);
   if (type_list != (SplayTreeInfo *) NULL)
     type_list=DestroySplayTree(type_list);
   instantiate_type=MagickFalse;
-  RelinquishSemaphoreInfo(type_semaphore);
+  UnlockSemaphoreInfo(type_semaphore);
   DestroySemaphoreInfo(&type_semaphore);
 }