From: Cristy Date: Mon, 24 Jul 2017 10:54:06 +0000 (-0400) Subject: A better way to persist the pixel cache on disk X-Git-Tag: 7.0.6-3~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cbd67c722a1c694575e49cabad4690f402802ed7;p=imagemagick A better way to persist the pixel cache on disk --- diff --git a/MagickCore/blob.h b/MagickCore/blob.h index e16fcc567..2caa3e863 100644 --- a/MagickCore/blob.h +++ b/MagickCore/blob.h @@ -28,7 +28,8 @@ typedef enum { ReadMode, WriteMode, - IOMode + IOMode, + PersistMode } MapMode; typedef ssize_t diff --git a/MagickCore/cache-private.h b/MagickCore/cache-private.h index 3ce6aa90e..efcabba6a 100644 --- a/MagickCore/cache-private.h +++ b/MagickCore/cache-private.h @@ -223,9 +223,6 @@ typedef struct _CacheInfo MagickCLCacheInfo opencl; - - MagickBooleanType - persist; } CacheInfo; extern MagickPrivate Cache diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 4e2fa22a8..9ac763f0a 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -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); diff --git a/MagickCore/resource.c b/MagickCore/resource.c index cf2545ece..7b00c1b74 100644 --- a/MagickCore/resource.c +++ b/MagickCore/resource.c @@ -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);