From: Cristy Date: Fri, 5 Apr 2019 00:48:17 +0000 (-0400) Subject: Revert cache optimization X-Git-Tag: 7.0.8-38~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=66a4983d4f4b62f8d6c791fc77ee06f1f87da005;p=imagemagick Revert cache optimization --- diff --git a/MagickCore/cache.c b/MagickCore/cache.c index a7c3026fc..366ea0ccf 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -263,21 +263,18 @@ MagickPrivate NexusInfo **AcquirePixelCacheNexus(const size_t number_threads) register ssize_t i; - nexus_info=(NexusInfo **) MagickAssumeAligned(AcquireAlignedMemory(2* + nexus_info=(NexusInfo **) MagickAssumeAligned(AcquireAlignedMemory( number_threads,sizeof(*nexus_info))); if (nexus_info == (NexusInfo **) NULL) ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); - *nexus_info=(NexusInfo *) AcquireQuantumMemory(2*number_threads, + nexus_info[0]=(NexusInfo *) AcquireQuantumMemory(number_threads, sizeof(**nexus_info)); - if (*nexus_info == (NexusInfo *) NULL) + if (nexus_info[0] == (NexusInfo *) NULL) ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); - (void) memset(*nexus_info,0,2*number_threads*sizeof(**nexus_info)); - for (i=0; i < (ssize_t) (2*number_threads); i++) + (void) memset(nexus_info[0],0,number_threads*sizeof(**nexus_info)); + for (i=0; i < (ssize_t) number_threads; i++) { - nexus_info[i]=(*nexus_info+i); - nexus_info[i]->pixel_nexus=(*nexus_info+i); - if (i < (ssize_t) number_threads) - nexus_info[i]->pixel_nexus=(*nexus_info+number_threads+i); + nexus_info[i]=(&nexus_info[0][i]); nexus_info[i]->signature=MagickCoreSignature; } return(nexus_info); @@ -420,6 +417,9 @@ static MagickBooleanType ClipPixelCacheNexus(Image *image, MagickSizeType number_pixels; + NexusInfo + **magick_restrict image_nexus; + register Quantum *magick_restrict p, *magick_restrict q; @@ -437,8 +437,9 @@ static MagickBooleanType ClipPixelCacheNexus(Image *image, cache_info=(CacheInfo *) image->cache; if (cache_info == (Cache) NULL) return(MagickFalse); + image_nexus=AcquirePixelCacheNexus(1); p=GetAuthenticPixelCacheNexus(image,nexus_info->region.x,nexus_info->region.y, - nexus_info->region.width,nexus_info->region.height,nexus_info->pixel_nexus, + nexus_info->region.width,nexus_info->region.height,image_nexus[0], exception); q=nexus_info->pixels; number_pixels=(MagickSizeType) nexus_info->region.width* @@ -471,6 +472,7 @@ static MagickBooleanType ClipPixelCacheNexus(Image *image, p+=GetPixelChannels(image); q+=GetPixelChannels(image); } + image_nexus=DestroyPixelCacheNexus(image_nexus,1); if (n < (ssize_t) number_pixels) return(MagickFalse); return(MagickTrue); @@ -1105,13 +1107,13 @@ MagickPrivate NexusInfo **DestroyPixelCacheNexus(NexusInfo **nexus_info, i; assert(nexus_info != (NexusInfo **) NULL); - for (i=0; i < (ssize_t) (2*number_threads); i++) + for (i=0; i < (ssize_t) number_threads; i++) { if (nexus_info[i]->cache != (Quantum *) NULL) RelinquishCacheNexusPixels(nexus_info[i]); nexus_info[i]->signature=(~MagickCoreSignature); } - *nexus_info=(NexusInfo *) RelinquishMagickMemory(*nexus_info); + nexus_info[0]=(NexusInfo *) RelinquishMagickMemory(nexus_info[0]); nexus_info=(NexusInfo **) RelinquishAlignedMemory(nexus_info); return(nexus_info); } @@ -2712,6 +2714,9 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, length, number_pixels; + NexusInfo + **magick_restrict virtual_nexus; + Quantum *magick_restrict pixels, virtual_pixel[MaxPixelChannels]; @@ -2790,6 +2795,7 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, Pixel request is outside cache extents. */ s=(unsigned char *) nexus_info->metacontent; + virtual_nexus=AcquirePixelCacheNexus(1); (void) memset(virtual_pixel,0,cache_info->number_channels* sizeof(*virtual_pixel)); virtual_metacontent=(void *) NULL; @@ -2815,6 +2821,7 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, cache_info->metacontent_extent); if (virtual_metacontent == (void *) NULL) { + virtual_nexus=DestroyPixelCacheNexus(virtual_nexus,1); (void) ThrowMagickException(exception,GetMagickModule(), CacheError,"UnableToGetCacheNexus","`%s'",image->filename); return((const Quantum *) NULL); @@ -2908,10 +2915,9 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, { p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, EdgeX(x_offset,cache_info->columns), - EdgeY(y_offset,cache_info->rows),1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + EdgeY(y_offset,cache_info->rows),1UL,1UL,*virtual_nexus, + exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case RandomVirtualPixelMethod: @@ -2921,19 +2927,17 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, RandomX(cache_info->random_info,cache_info->columns), RandomY(cache_info->random_info,cache_info->rows),1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + *virtual_nexus,exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case DitherVirtualPixelMethod: { p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, DitherX(x_offset,cache_info->columns), - DitherY(y_offset,cache_info->rows),1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + DitherY(y_offset,cache_info->rows),1UL,1UL,*virtual_nexus, + exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case TileVirtualPixelMethod: @@ -2941,10 +2945,9 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, - x_modulo.remainder,y_modulo.remainder,1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + x_modulo.remainder,y_modulo.remainder,1UL,1UL,*virtual_nexus, + exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case MirrorVirtualPixelMethod: @@ -2958,10 +2961,9 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, y_modulo.remainder=(ssize_t) cache_info->rows- y_modulo.remainder-1L; p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, - x_modulo.remainder,y_modulo.remainder,1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + x_modulo.remainder,y_modulo.remainder,1UL,1UL,*virtual_nexus, + exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case HorizontalTileEdgeVirtualPixelMethod: @@ -2969,9 +2971,8 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, x_modulo.remainder,EdgeY(y_offset,cache_info->rows),1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + *virtual_nexus,exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case VerticalTileEdgeVirtualPixelMethod: @@ -2979,9 +2980,8 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, EdgeX(x_offset,cache_info->columns),y_modulo.remainder,1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + *virtual_nexus,exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case BackgroundVirtualPixelMethod: @@ -3006,10 +3006,9 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, break; } p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, - x_modulo.remainder,y_modulo.remainder,1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + x_modulo.remainder,y_modulo.remainder,1UL,1UL,*virtual_nexus, + exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case HorizontalTileVirtualPixelMethod: @@ -3023,10 +3022,9 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, - x_modulo.remainder,y_modulo.remainder,1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + x_modulo.remainder,y_modulo.remainder,1UL,1UL,*virtual_nexus, + exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } case VerticalTileVirtualPixelMethod: @@ -3040,10 +3038,9 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, x_modulo=VirtualPixelModulo(x_offset,cache_info->columns); y_modulo=VirtualPixelModulo(y_offset,cache_info->rows); p=GetVirtualPixelCacheNexus(image,virtual_pixel_method, - x_modulo.remainder,y_modulo.remainder,1UL,1UL, - nexus_info->pixel_nexus,exception); - r=GetVirtualMetacontentFromNexus(cache_info, - nexus_info->pixel_nexus); + x_modulo.remainder,y_modulo.remainder,1UL,1UL,*virtual_nexus, + exception); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); break; } } @@ -3063,10 +3060,10 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, Transfer a run of pixels. */ p=GetVirtualPixelCacheNexus(image,virtual_pixel_method,x_offset,y_offset, - (size_t) length,1UL,nexus_info->pixel_nexus,exception); + (size_t) length,1UL,*virtual_nexus,exception); if (p == (const Quantum *) NULL) break; - r=GetVirtualMetacontentFromNexus(cache_info,nexus_info->pixel_nexus); + r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus); (void) memcpy(q,p,(size_t) (cache_info->number_channels*length* sizeof(*p))); q+=cache_info->number_channels*length; @@ -3084,6 +3081,7 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image, */ if (virtual_metacontent != (void *) NULL) virtual_metacontent=(void *) RelinquishMagickMemory(virtual_metacontent); + virtual_nexus=DestroyPixelCacheNexus(virtual_nexus,1); if (v < (ssize_t) rows) return((const Quantum *) NULL); return(pixels); @@ -3398,6 +3396,9 @@ static MagickBooleanType MaskPixelCacheNexus(Image *image,NexusInfo *nexus_info, MagickSizeType number_pixels; + NexusInfo + **magick_restrict image_nexus; + register Quantum *magick_restrict p, *magick_restrict q; @@ -3415,8 +3416,9 @@ static MagickBooleanType MaskPixelCacheNexus(Image *image,NexusInfo *nexus_info, cache_info=(CacheInfo *) image->cache; if (cache_info == (Cache) NULL) return(MagickFalse); + image_nexus=AcquirePixelCacheNexus(1); p=GetAuthenticPixelCacheNexus(image,nexus_info->region.x,nexus_info->region.y, - nexus_info->region.width,nexus_info->region.height,nexus_info->pixel_nexus, + nexus_info->region.width,nexus_info->region.height,image_nexus[0], exception); q=nexus_info->pixels; number_pixels=(MagickSizeType) nexus_info->region.width* @@ -3444,6 +3446,7 @@ static MagickBooleanType MaskPixelCacheNexus(Image *image,NexusInfo *nexus_info, p+=GetPixelChannels(image); q+=GetPixelChannels(image); } + image_nexus=DestroyPixelCacheNexus(image_nexus,1); if (n < (ssize_t) number_pixels) return(MagickFalse); return(MagickTrue); @@ -5049,8 +5052,8 @@ static Quantum *SetPixelCacheNexusPixels( return((Quantum *) NULL); } number_pixels=(MagickSizeType) width*height; - length=MagickMax(number_pixels,MagickMax(cache_info->columns, - cache_info->rows))*cache_info->number_channels*sizeof(*nexus_info->pixels); + length=MagickMax(number_pixels,cache_info->columns)* + cache_info->number_channels*sizeof(*nexus_info->pixels); if (cache_info->metacontent_extent != 0) length+=number_pixels*cache_info->metacontent_extent; status=MagickTrue;