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;
 }

 /*