]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/cache.c
(no commit message)
[imagemagick] / MagickCore / cache.c
index 3aae81762dac39656ec87f33d05a3b5bd328a89a..204f129f03ed9f1dddf050e671bd168ca9c14c09 100644 (file)
@@ -324,7 +324,8 @@ MagickPrivate const void *AcquirePixelCachePixels(const Image *image,
 */
 MagickPrivate MagickBooleanType CacheComponentGenesis(void)
 {
-  cache_semaphore=AcquireSemaphoreInfo();
+  if (cache_semaphore == (SemaphoreInfo *) NULL)
+    cache_semaphore=AcquireSemaphoreInfo();
   return(MagickTrue);
 }
 \f
@@ -3215,12 +3216,8 @@ static MagickBooleanType OpenPixelCacheOnDisk(CacheInfo *cache_info,
   /*
     Open pixel cache on disk.
   */
-  LockSemaphoreInfo(cache_info->file_semaphore);
   if (cache_info->file != -1)
-    {
-      UnlockSemaphoreInfo(cache_info->file_semaphore);
-      return(MagickTrue);  /* cache already open */
-    }
+    return(MagickTrue);  /* cache already open */
   if (*cache_info->cache_filename == '\0')
     file=AcquireUniqueFileResource(cache_info->cache_filename);
   else
@@ -3250,14 +3247,10 @@ static MagickBooleanType OpenPixelCacheOnDisk(CacheInfo *cache_info,
       }
     }
   if (file == -1)
-    {
-      UnlockSemaphoreInfo(cache_info->file_semaphore);
-      return(MagickFalse);
-    }
+    return(MagickFalse);
   (void) AcquireMagickResource(FileResource,1);
   cache_info->file=file;
   cache_info->mode=mode;
-  UnlockSemaphoreInfo(cache_info->file_semaphore);
   return(MagickTrue);
 }
 
@@ -3272,12 +3265,8 @@ static inline MagickOffsetType WritePixelCacheRegion(
     count;
 
 #if !defined(MAGICKCORE_HAVE_PWRITE)
-  LockSemaphoreInfo(cache_info->file_semaphore);
   if (lseek(cache_info->file,offset,SEEK_SET) < 0)
-    {
-      UnlockSemaphoreInfo(cache_info->file_semaphore);
-      return((MagickOffsetType) -1);
-    }
+    return((MagickOffsetType) -1);
 #endif
   count=0;
   for (i=0; i < (MagickOffsetType) length; i+=count)
@@ -3296,9 +3285,6 @@ static inline MagickOffsetType WritePixelCacheRegion(
           break;
       }
   }
-#if !defined(MAGICKCORE_HAVE_PREAD)
-  UnlockSemaphoreInfo(cache_info->file_semaphore);
-#endif
   return(i);
 }
 
@@ -4042,12 +4028,8 @@ static inline MagickOffsetType ReadPixelCacheRegion(
     count;
 
 #if !defined(MAGICKCORE_HAVE_PREAD)
-  LockSemaphoreInfo(cache_info->file_semaphore);
   if (lseek(cache_info->file,offset,SEEK_SET) < 0)
-    {
-      UnlockSemaphoreInfo(cache_info->file_semaphore);
-      return((MagickOffsetType) -1);
-    }
+    return((MagickOffsetType) -1);
 #endif
   count=0;
   for (i=0; i < (MagickOffsetType) length; i+=count)
@@ -4066,9 +4048,6 @@ static inline MagickOffsetType ReadPixelCacheRegion(
           break;
       }
   }
-#if !defined(MAGICKCORE_HAVE_PREAD)
-  UnlockSemaphoreInfo(cache_info->file_semaphore);
-#endif
   return(i);
 }
 
@@ -4137,10 +4116,12 @@ static MagickBooleanType ReadPixelCacheMetacontent(
       /*
         Read meta content from disk.
       */
+      LockSemaphoreInfo(cache_info->file_semaphore);
       if (OpenPixelCacheOnDisk(cache_info,IOMode) == MagickFalse)
         {
           ThrowFileException(exception,FileOpenError,"UnableToOpenFile",
             cache_info->cache_filename);
+          UnlockSemaphoreInfo(cache_info->file_semaphore);
           return(MagickFalse);
         }
       if ((cache_info->columns == nexus_info->region.width) &&
@@ -4162,6 +4143,7 @@ static MagickBooleanType ReadPixelCacheMetacontent(
       }
       if (IsFileDescriptorLimitExceeded() != MagickFalse)
         (void) ClosePixelCacheOnDisk(cache_info);
+      UnlockSemaphoreInfo(cache_info->file_semaphore);
       break;
     }
     case DistributedCache:
@@ -4301,10 +4283,12 @@ static MagickBooleanType ReadPixelCachePixels(CacheInfo *restrict cache_info,
       /*
         Read pixels from disk.
       */
+      LockSemaphoreInfo(cache_info->file_semaphore);
       if (OpenPixelCacheOnDisk(cache_info,IOMode) == MagickFalse)
         {
           ThrowFileException(exception,FileOpenError,"UnableToOpenFile",
             cache_info->cache_filename);
+          UnlockSemaphoreInfo(cache_info->file_semaphore);
           return(MagickFalse);
         }
       if ((cache_info->columns == nexus_info->region.width) &&
@@ -4324,6 +4308,7 @@ static MagickBooleanType ReadPixelCachePixels(CacheInfo *restrict cache_info,
       }
       if (IsFileDescriptorLimitExceeded() != MagickFalse)
         (void) ClosePixelCacheOnDisk(cache_info);
+      UnlockSemaphoreInfo(cache_info->file_semaphore);
       break;
     }
     case DistributedCache:
@@ -5109,10 +5094,12 @@ static MagickBooleanType WritePixelCacheMetacontent(CacheInfo *cache_info,
       /*
         Write associated pixels to disk.
       */
+      LockSemaphoreInfo(cache_info->file_semaphore);
       if (OpenPixelCacheOnDisk(cache_info,IOMode) == MagickFalse)
         {
           ThrowFileException(exception,FileOpenError,"UnableToOpenFile",
             cache_info->cache_filename);
+          UnlockSemaphoreInfo(cache_info->file_semaphore);
           return(MagickFalse);
         }
       if ((cache_info->columns == nexus_info->region.width) &&
@@ -5134,6 +5121,7 @@ static MagickBooleanType WritePixelCacheMetacontent(CacheInfo *cache_info,
       }
       if (IsFileDescriptorLimitExceeded() != MagickFalse)
         (void) ClosePixelCacheOnDisk(cache_info);
+      UnlockSemaphoreInfo(cache_info->file_semaphore);
       break;
     }
     case DistributedCache:
@@ -5273,10 +5261,12 @@ static MagickBooleanType WritePixelCachePixels(CacheInfo *restrict cache_info,
       /*
         Write pixels to disk.
       */
+      LockSemaphoreInfo(cache_info->file_semaphore);
       if (OpenPixelCacheOnDisk(cache_info,IOMode) == MagickFalse)
         {
           ThrowFileException(exception,FileOpenError,"UnableToOpenFile",
             cache_info->cache_filename);
+          UnlockSemaphoreInfo(cache_info->file_semaphore);
           return(MagickFalse);
         }
       if ((cache_info->columns == nexus_info->region.width) &&
@@ -5297,6 +5287,7 @@ static MagickBooleanType WritePixelCachePixels(CacheInfo *restrict cache_info,
       }
       if (IsFileDescriptorLimitExceeded() != MagickFalse)
         (void) ClosePixelCacheOnDisk(cache_info);
+      UnlockSemaphoreInfo(cache_info->file_semaphore);
       break;
     }
     case DistributedCache: