]> granicus.if.org Git - imagemagick/commitdiff
A better way to persist the pixel cache on disk
authorCristy <urban-warrior@imagemagick.org>
Mon, 24 Jul 2017 10:54:06 +0000 (06:54 -0400)
committerCristy <urban-warrior@imagemagick.org>
Mon, 24 Jul 2017 10:54:06 +0000 (06:54 -0400)
MagickCore/blob.h
MagickCore/cache-private.h
MagickCore/cache.c
MagickCore/resource.c

index e16fcc567ddaa11a55b4ec4c4f68a8dd67a3823d..2caa3e86398707312d7a18cb6d914a08238fae14 100644 (file)
@@ -28,7 +28,8 @@ typedef enum
 {
   ReadMode,
   WriteMode,
-  IOMode
+  IOMode,
+  PersistMode
 } MapMode;
 
 typedef ssize_t
index 3ce6aa90e9951a1f2b1f5de4280672017905c64a..efcabba6a0033fc3107b9459eafa84a5e00252fd 100644 (file)
@@ -223,9 +223,6 @@ typedef struct _CacheInfo
 
   MagickCLCacheInfo
     opencl;
-
-  MagickBooleanType
-    persist;
 } CacheInfo;
 
 extern MagickPrivate Cache
index 4e2fa22a8f1e0cec9fa63e2245a442abefc651f9..9ac763f0a1d11e6f48b267fdf6f97c7e3f004873 100644 (file)
@@ -902,7 +902,7 @@ static inline void RelinquishPixelCachePixels(CacheInfo *cache_info)
     {
       (void) UnmapBlob(cache_info->pixels,(size_t) cache_info->length);
       cache_info->pixels=(Quantum *) NULL;
-      if (cache_info->mode != ReadMode)
+      if ((cache_info->mode != ReadMode) && (cache_info->mode != PersistMode))
         (void) RelinquishUniqueFileResource(cache_info->cache_filename);
       *cache_info->cache_filename='\0';
       RelinquishMagickResource(MapResource,cache_info->length);
@@ -911,7 +911,7 @@ static inline void RelinquishPixelCachePixels(CacheInfo *cache_info)
     {
       if (cache_info->file != -1)
         (void) ClosePixelCacheOnDisk(cache_info);
-      if (cache_info->mode != ReadMode)
+      if ((cache_info->mode != ReadMode) && (cache_info->mode != PersistMode))
         (void) RelinquishUniqueFileResource(cache_info->cache_filename);
       *cache_info->cache_filename='\0';
       RelinquishMagickResource(DiskResource,cache_info->length);
@@ -3544,7 +3544,7 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode,
       return(MagickTrue);
     }
   status=AcquireMagickResource(AreaResource,cache_info->length);
-  if ((status != MagickFalse) && (cache_info->persist != MagickFalse))
+  if (cache_info->mode == PersistMode)
     status=MagickFalse;
   length=number_pixels*(cache_info->number_channels*sizeof(Quantum)+
     cache_info->metacontent_extent);
@@ -3672,7 +3672,7 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode,
       return(MagickFalse);
     }
   if ((source_info.storage_class != UndefinedClass) && (mode != ReadMode) &&
-      (cache_info->persist != MagickFalse))
+      (cache_info->mode != PersistMode))
     {
       (void) ClosePixelCacheOnDisk(cache_info);
       *cache_info->cache_filename='\0';
@@ -3868,7 +3868,7 @@ MagickExport MagickBooleanType PersistPixelCache(Image *image,
     return(MagickFalse);
   clone_info=(CacheInfo *) clone_image->cache;
   (void) CopyMagickString(clone_info->cache_filename,filename,MagickPathExtent);
-  clone_info->persist=MagickTrue;
+  clone_info->mode=PersistMode;
   clone_info->offset=(*offset);
   status=ClonePixelCacheRepository(clone_info,image->cache,exception);
   *offset+=cache_info->length+page_size-(cache_info->length % page_size);
index cf2545eceb5b0fa4a152d1e0597bfa8de83c7f23..7b00c1b741d9ddf41b60c5aff77973f709a7f1ac 100644 (file)
@@ -1009,12 +1009,9 @@ MagickExport MagickBooleanType RelinquishUniqueFileResource(const char *path)
   if (temporary_resources != (SplayTreeInfo *) NULL)
     status=DeleteNodeFromSplayTree(temporary_resources,(const void *) path);
   UnlockSemaphoreInfo(resource_semaphore);
-  if (status != MagickFalse)
-    {
-      (void) CopyMagickString(cache_path,path,MagickPathExtent);
-      AppendImageFormat("cache",cache_path);
-      (void) ShredFile(cache_path);
-    }
+  (void) CopyMagickString(cache_path,path,MagickPathExtent);
+  AppendImageFormat("cache",cache_path);
+  (void) ShredFile(cache_path);
   if (status == MagickFalse)
     status=ShredFile(path);
   return(status);