Commit 234e79656 for imagemagick.org
commit 234e796567f8b6c502c6b4326b8123a7ae1ed749
Author: Cristy <urban-warrior@imagemagick.org>
Date: Sun Nov 15 08:34:21 2026 -0500
eliminate the extra lseek() syscall on every disk cache stripe
diff --git a/MagickCore/cache.c b/MagickCore/cache.c
index bdff96554..6488150d9 100644
--- a/MagickCore/cache.c
+++ b/MagickCore/cache.c
@@ -384,10 +384,11 @@ MagickPrivate MagickBooleanType CacheComponentGenesis(void)
*/
MagickPrivate void CacheComponentTerminus(void)
{
- if (cache_semaphore == (SemaphoreInfo *) NULL)
- ActivateSemaphoreInfo(&cache_semaphore);
- /* no op-- nothing to destroy */
- RelinquishSemaphoreInfo(&cache_semaphore);
+ if (cache_semaphore != (SemaphoreInfo *) NULL)
+ {
+ ActivateSemaphoreInfo(&cache_semaphore);
+ RelinquishSemaphoreInfo(&cache_semaphore);
+ }
}
/*
@@ -818,14 +819,22 @@ static MagickBooleanType ClonePixelCacheRepository(
pixels=SetPixelCacheNexusPixels(cache_info,ReadMode,0,y,
cache_info->columns,1,MagickFalse,cache_nexus[id],exception);
if (pixels == (Quantum *) NULL)
- continue;
- status=ReadPixelCachePixels(cache_info,cache_nexus[id],exception);
- if (status == MagickFalse)
- continue;
+ {
+ status=MagickFalse;
+ continue;
+ }
+ if (ReadPixelCachePixels(cache_info,cache_nexus[id],exception) == MagickFalse)
+ {
+ status=MagickFalse;
+ continue;
+ }
pixels=SetPixelCacheNexusPixels(clone_info,WriteMode,0,y,
clone_info->columns,1,MagickTrue,clone_nexus[id],exception);
if (pixels == (Quantum *) NULL)
- continue;
+ {
+ status=MagickFalse;
+ continue;
+ }
(void) memset(clone_nexus[id]->pixels,0,(size_t) clone_nexus[id]->length);
if (optimize != MagickFalse)
(void) memcpy(clone_nexus[id]->pixels,cache_nexus[id]->pixels,length*
@@ -867,15 +876,21 @@ static MagickBooleanType ClonePixelCacheRepository(
p+=(ptrdiff_t) cache_info->number_channels;
}
}
- status=WritePixelCachePixels(clone_info,clone_nexus[id],exception);
+ if (WritePixelCachePixels(clone_info,clone_nexus[id],exception) == MagickFalse)
+ status=MagickFalse;
}
- if ((cache_info->metacontent_extent != 0) &&
+ if ((status != MagickFalse) && (cache_info->metacontent_extent != 0) &&
(clone_info->metacontent_extent != 0))
{
+ size_t
+ columns,
+ metacontent_length;
+
/*
Clone metacontent.
*/
- length=(size_t) MagickMin(cache_info->metacontent_extent,
+ columns=(size_t) MagickMin(cache_info->columns,clone_info->columns);
+ metacontent_length=(size_t) MagickMin(cache_info->metacontent_extent,
clone_info->metacontent_extent);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
#pragma omp parallel for schedule(static) shared(status) \
@@ -896,19 +911,54 @@ static MagickBooleanType ClonePixelCacheRepository(
pixels=SetPixelCacheNexusPixels(cache_info,ReadMode,0,y,
cache_info->columns,1,MagickFalse,cache_nexus[id],exception);
if (pixels == (Quantum *) NULL)
- continue;
- status=ReadPixelCacheMetacontent(cache_info,cache_nexus[id],exception);
- if (status == MagickFalse)
- continue;
+ {
+ status=MagickFalse;
+ continue;
+ }
+ if (ReadPixelCacheMetacontent(cache_info,cache_nexus[id],exception) == MagickFalse)
+ {
+ status=MagickFalse;
+ continue;
+ }
pixels=SetPixelCacheNexusPixels(clone_info,WriteMode,0,y,
clone_info->columns,1,MagickTrue,clone_nexus[id],exception);
if (pixels == (Quantum *) NULL)
- continue;
+ {
+ status=MagickFalse;
+ continue;
+ }
if ((clone_nexus[id]->metacontent != (void *) NULL) &&
(cache_nexus[id]->metacontent != (void *) NULL))
- (void) memcpy(clone_nexus[id]->metacontent,
- cache_nexus[id]->metacontent,length*sizeof(unsigned char));
- status=WritePixelCacheMetacontent(clone_info,clone_nexus[id],exception);
+ {
+ if ((cache_info->metacontent_extent == clone_info->metacontent_extent) &&
+ (cache_info->columns == clone_info->columns))
+ (void) memcpy(clone_nexus[id]->metacontent,
+ cache_nexus[id]->metacontent,columns*metacontent_length);
+ else
+ {
+ const unsigned char
+ *magick_restrict p;
+
+ ssize_t
+ x;
+
+ unsigned char
+ *magick_restrict q;
+
+ (void) memset(clone_nexus[id]->metacontent,0,
+ clone_info->columns*clone_info->metacontent_extent);
+ p=(const unsigned char *) cache_nexus[id]->metacontent;
+ q=(unsigned char *) clone_nexus[id]->metacontent;
+ for (x=0; x < (ssize_t) columns; x++)
+ {
+ (void) memcpy(q,p,metacontent_length);
+ p+=(ptrdiff_t) cache_info->metacontent_extent;
+ q+=(ptrdiff_t) clone_info->metacontent_extent;
+ }
+ }
+ }
+ if (WritePixelCacheMetacontent(clone_info,clone_nexus[id],exception) == MagickFalse)
+ status=MagickFalse;
}
}
clone_nexus=DestroyPixelCacheNexus(clone_nexus,clone_info->number_threads);
@@ -1333,12 +1383,16 @@ MagickPrivate cl_mem GetAuthenticOpenCLBuffer(const Image *image,
CacheInfo
*magick_restrict cache_info;
+ cl_mem
+ buffer;
+
assert(image != (const Image *) NULL);
assert(device != (const MagickCLDevice) NULL);
cache_info=(CacheInfo *) image->cache;
if ((cache_info->type == UndefinedCache) || (cache_info->reference_count > 1))
{
- (void) SyncImagePixelCache((Image *) image,exception);
+ if (SyncImagePixelCache((Image *) image,exception) == MagickFalse)
+ return((cl_mem) NULL);
cache_info=(CacheInfo *) image->cache;
}
if ((cache_info->type != MemoryCache) || (cache_info->mapped != MagickFalse))
@@ -1353,13 +1407,15 @@ MagickPrivate cl_mem GetAuthenticOpenCLBuffer(const Image *image,
cache_info->opencl=AcquireMagickCLCacheInfo(device,cache_info->pixels,
cache_info->length);
}
+ buffer=(cl_mem) NULL;
if (cache_info->opencl != (MagickCLCacheInfo) NULL)
- RetainOpenCLMemObject(cache_info->opencl->buffer);
+ {
+ assert(cache_info->opencl->pixels == cache_info->pixels);
+ RetainOpenCLMemObject(cache_info->opencl->buffer);
+ buffer=cache_info->opencl->buffer;
+ }
UnlockSemaphoreInfo(cache_info->semaphore);
- if (cache_info->opencl == (MagickCLCacheInfo) NULL)
- return((cl_mem) NULL);
- assert(cache_info->opencl->pixels == cache_info->pixels);
- return(cache_info->opencl->buffer);
+ return(buffer);
}
#endif
@@ -3063,7 +3119,12 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image,
case RandomVirtualPixelMethod:
{
if (cache_info->random_info == (RandomInfo *) NULL)
- cache_info->random_info=AcquireRandomInfo();
+ {
+ LockSemaphoreInfo(cache_info->semaphore);
+ if (cache_info->random_info == (RandomInfo *) NULL)
+ cache_info->random_info=AcquireRandomInfo();
+ UnlockSemaphoreInfo(cache_info->semaphore);
+ }
p=GetVirtualPixelCacheNexus(image,virtual_pixel_method,
RandomX(cache_info->random_info,cache_info->columns),
RandomY(cache_info->random_info,cache_info->rows),1UL,1UL,
@@ -3209,7 +3270,7 @@ MagickPrivate const Quantum *GetVirtualPixelCacheNexus(const Image *image,
q+=(ptrdiff_t) (cache_info->number_channels*length);
if ((r != (void *) NULL) && (s != (const void *) NULL))
{
- (void) memcpy(s,r,(size_t) length);
+ (void) memcpy(s,r,(size_t) (length*cache_info->metacontent_extent));
s+=(ptrdiff_t) (length*cache_info->metacontent_extent);
}
}
@@ -3719,12 +3780,26 @@ static inline MagickOffsetType WritePixelCacheRegion(
ssize_t
count = 0;
- if (lseek(cache_info->file,offset,SEEK_SET) < 0)
- return((MagickOffsetType) -1);
+#if !defined(MAGICKCORE_HAVE_PWRITE)
+ if (lseek(cache_info->file,offset,SEEK_SET) < 0)
+ return((MagickOffsetType) -1);
+#endif
for (i=0; i < (MagickOffsetType) length; i+=count)
{
- count=MagickWrite(cache_info->file,buffer+i,(size_t) MagickMin(length-
- (MagickSizeType) i,MagickMaxBufferExtent));
+ size_t
+ extent;
+
+ extent=(size_t) MagickMin(length-(MagickSizeType) i,MagickMaxBufferExtent);
+#if defined(MAGICKCORE_HAVE_PWRITE)
+ count=pwrite(cache_info->file,buffer+i,extent,(off_t) (offset+i));
+ if ((count < 0) && (errno == EINTR))
+ {
+ count=0;
+ continue;
+ }
+#else
+ count=MagickWrite(cache_info->file,buffer+i,extent);
+#endif
if (count <= 0)
break;
}
@@ -3770,7 +3845,7 @@ static MagickBooleanType SetPixelCacheExtent(Image *image,MagickSizeType length)
return(MagickFalse);
#if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
if (cache_info->synchronize != MagickFalse)
- if (posix_fallocate(cache_info->file,offset+1,extent-offset) != 0)
+ if (posix_fallocate(cache_info->file,offset,extent-offset) != 0)
return(MagickFalse);
#endif
}
@@ -4673,12 +4748,27 @@ static inline MagickOffsetType ReadPixelCacheRegion(
ssize_t
count = 0;
+#if !defined(MAGICKCORE_HAVE_PREAD)
if (lseek(cache_info->file,offset,SEEK_SET) < 0)
return((MagickOffsetType) -1);
+#endif
for (i=0; i < (MagickOffsetType) length; i+=count)
{
- count=MagickRead(cache_info->file,buffer+i,(size_t) MagickMin(length-
- (MagickSizeType) i,(size_t) MagickMaxBufferExtent));
+ size_t
+ extent;
+
+ extent=(size_t) MagickMin(length-(MagickSizeType) i,
+ (size_t) MagickMaxBufferExtent);
+#if defined(MAGICKCORE_HAVE_PREAD)
+ count=pread(cache_info->file,buffer+i,extent,(off_t) (offset+i));
+ if ((count < 0) && (errno == EINTR))
+ {
+ count=0;
+ continue;
+ }
+#else
+ count=MagickRead(cache_info->file,buffer+i,extent);
+#endif
if (count <= 0)
break;
}
@@ -5239,17 +5329,17 @@ MagickPrivate void SetPixelCacheMethods(Cache cache,CacheMethods *cache_methods)
cache_info->methods.get_authentic_metacontent_from_handler=
cache_methods->get_authentic_metacontent_from_handler;
get_one_virtual_pixel_from_handler=
- cache_info->methods.get_one_virtual_pixel_from_handler;
+ cache_methods->get_one_virtual_pixel_from_handler;
if (get_one_virtual_pixel_from_handler !=
(GetOneVirtualPixelFromHandler) NULL)
cache_info->methods.get_one_virtual_pixel_from_handler=
- cache_methods->get_one_virtual_pixel_from_handler;
+ get_one_virtual_pixel_from_handler;
get_one_authentic_pixel_from_handler=
cache_methods->get_one_authentic_pixel_from_handler;
if (get_one_authentic_pixel_from_handler !=
(GetOneAuthenticPixelFromHandler) NULL)
cache_info->methods.get_one_authentic_pixel_from_handler=
- cache_methods->get_one_authentic_pixel_from_handler;
+ get_one_authentic_pixel_from_handler;
}
/*