]> granicus.if.org Git - imagemagick/commitdiff
https://github.com/ImageMagick/ImageMagick/issues/552
authorCristy <urban-warrior@imagemagick.org>
Sun, 23 Jul 2017 21:09:32 +0000 (17:09 -0400)
committerCristy <urban-warrior@imagemagick.org>
Sun, 23 Jul 2017 21:09:32 +0000 (17:09 -0400)
ChangeLog
MagickCore/cache-private.h
MagickCore/cache.c
MagickCore/resource.c

index 4ac4b66712834c1ecf84924380981dc7eef9b42b..88347602398798be1d4beea6ded34c1714c536bb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,3 @@
-2017-07-23  7.0.6-3 Cristy  <quetzlzacatenango@image...>
-  * Release ImageMagick version 7.0.6-3, GIT revision 20582:b6e1fa3f6:20170723.
-
 2017-07-23  7.0.6-3 Cristy  <quetzlzacatenango@image...>
   * Fixed numerous memory leaks (reference
     https://github.com/ImageMagick/ImageMagick/issues).
index efcabba6a0033fc3107b9459eafa84a5e00252fd..0f7f8d288d39a6f965ccaebb9ad0e0b0872bfde7 100644 (file)
@@ -223,6 +223,9 @@ typedef struct _CacheInfo
 
   MagickCLCacheInfo
     opencl;
+
+  MagickBooleanType
+    persist,
 } CacheInfo;
 
 extern MagickPrivate Cache
index 2e3e50ed3716d714e468b9450481ed896e3de91b..4e2fa22a8f1e0cec9fa63e2245a442abefc651f9 100644 (file)
@@ -3544,6 +3544,8 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode,
       return(MagickTrue);
     }
   status=AcquireMagickResource(AreaResource,cache_info->length);
+  if ((status != MagickFalse) && (cache_info->persist != MagickFalse))
+    status=MagickFalse;
   length=number_pixels*(cache_info->number_channels*sizeof(Quantum)+
     cache_info->metacontent_extent);
   if ((status != MagickFalse) && (length == (MagickSizeType) ((size_t) length)))
@@ -3669,7 +3671,8 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode,
         "CacheResourcesExhausted","`%s'",image->filename);
       return(MagickFalse);
     }
-  if ((source_info.storage_class != UndefinedClass) && (mode != ReadMode))
+  if ((source_info.storage_class != UndefinedClass) && (mode != ReadMode) &&
+      (cache_info->persist != MagickFalse))
     {
       (void) ClosePixelCacheOnDisk(cache_info);
       *cache_info->cache_filename='\0';
@@ -3819,7 +3822,7 @@ MagickExport MagickBooleanType PersistPixelCache(Image *image,
     *magick_restrict clone_info;
 
   Image
-    clone_image;
+    *clone_image;
 
   MagickBooleanType
     status;
@@ -3860,19 +3863,16 @@ MagickExport MagickBooleanType PersistPixelCache(Image *image,
   /*
     Clone persistent pixel cache.
   */
-  clone_image=(*image);
-  clone_info=(CacheInfo *) clone_image.cache;
-  image->cache=ClonePixelCache(cache_info);
-  cache_info=(CacheInfo *) ReferencePixelCache(image->cache);
-  (void) CopyMagickString(cache_info->cache_filename,filename,MagickPathExtent);
-  cache_info->type=DiskCache;
-  cache_info->offset=(*offset);
-  cache_info=(CacheInfo *) image->cache;
-  status=OpenPixelCache(image,IOMode,exception);
-  if (status != MagickFalse)
-    status=ClonePixelCacheRepository(cache_info,clone_info,exception);
+  clone_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception);
+  if (clone_image == (Image *) NULL)
+    return(MagickFalse);
+  clone_info=(CacheInfo *) clone_image->cache;
+  (void) CopyMagickString(clone_info->cache_filename,filename,MagickPathExtent);
+  clone_info->persist=MagickTrue;
+  clone_info->offset=(*offset);
+  status=ClonePixelCacheRepository(clone_info,image->cache,exception);
   *offset+=cache_info->length+page_size-(cache_info->length % page_size);
-  clone_info=(CacheInfo *) DestroyPixelCache(clone_info);
+  clone_image=DestroyImage(clone_image);
   return(status);
 }
 \f
index 78e15d100c85dc696ae9b4c1191720c7dbfa2acc..cf2545eceb5b0fa4a152d1e0597bfa8de83c7f23 100644 (file)
@@ -1007,11 +1007,14 @@ MagickExport MagickBooleanType RelinquishUniqueFileResource(const char *path)
     ActivateSemaphoreInfo(&resource_semaphore);
   LockSemaphoreInfo(resource_semaphore);
   if (temporary_resources != (SplayTreeInfo *) NULL)
-    status=DeleteNodeFromSplayTree(temporary_resources, (const void *) path);
+    status=DeleteNodeFromSplayTree(temporary_resources,(const void *) path);
   UnlockSemaphoreInfo(resource_semaphore);
-  (void) CopyMagickString(cache_path,path,MagickPathExtent);
-  AppendImageFormat("cache",cache_path);
-  (void) ShredFile(cache_path);
+  if (status != MagickFalse)
+    {
+      (void) CopyMagickString(cache_path,path,MagickPathExtent);
+      AppendImageFormat("cache",cache_path);
+      (void) ShredFile(cache_path);
+    }
   if (status == MagickFalse)
     status=ShredFile(path);
   return(status);