GraphicsMagick: Resource limited memory: Maintain a tally of the...

GraphicsMagick Commits <[email protected]>
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.46226.1640798273.1346.graphicsmagick-commit@lists.sourceforge.net>
changeset e0e762ead892 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=e0e762ead892
summary: Resource limited memory: Maintain a tally of the total number of octets moved by realloc.

diffstat:

 ChangeLog                              |   9 +++++++++
 VisualMagick/installer/inc/version.isx |   4 ++--
 magick/memory-private.h                |  18 +++++++++++-------
 magick/memory.c                        |  24 ++++++++++++++++++++----
 magick/version.h                       |   4 ++--
 www/Changelog.html                     |   8 ++++++++
 6 files changed, 52 insertions(+), 15 deletions(-)

diffs (184 lines):

diff -r cbfeeef1ceab -r e0e762ead892 ChangeLog
--- a/ChangeLog	Mon Dec 27 13:43:38 2021 -0600
+++ b/ChangeLog	Wed Dec 29 11:17:33 2021 -0600
@@ -1,3 +1,12 @@
+2021-12-29  Bob Friesenhahn  <[email protected]>
+
+        * magick/memory-private.h(_MagickReallocateResourceLimitedMemory)
+        : Remove use of GCC/Clang '__attribute_malloc__' since it is not
+        appropriate for this function.
+
+        * magick/memory.c (_MagickReallocateResourceLimitedMemory):
+        Maintain a tally of the total number of octets moved by realloc.
+
 2021-12-27  Bob Friesenhahn  <[email protected]>
 
         * coders/mat.c (ReadMATImage): Change 'ldblk' to size_t and
diff -r cbfeeef1ceab -r e0e762ead892 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Mon Dec 27 13:43:38 2021 -0600
+++ b/VisualMagick/installer/inc/version.isx	Wed Dec 29 11:17:33 2021 -0600
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020211227"
-#define public MagickPackageReleaseDate "snapshot-20211227"
+#define public MagickPackageVersionAddendum ".020211229"
+#define public MagickPackageReleaseDate "snapshot-20211229"
diff -r cbfeeef1ceab -r e0e762ead892 magick/memory-private.h
--- a/magick/memory-private.h	Mon Dec 27 13:43:38 2021 -0600
+++ b/magick/memory-private.h	Wed Dec 29 11:17:33 2021 -0600
@@ -16,10 +16,10 @@
   MagickArraySize(const size_t count,const size_t size) MAGICK_FUNC_CONST;
 
 extern MagickExport
-  void *_MagickReallocateResourceLimitedMemory(void *p,const size_t count,const size_t size,const MagickBool clear);
+  void *_MagickReallocateResourceLimitedMemory(void *p,const size_t count,const size_t size,const MagickBool clear) MAGICK_FUNC_ALLOC_SIZE_2ARG(2,3);
 
 extern MagickExport
-  void *_MagickAllocateResourceLimitedMemory(const size_t size);
+  void *_MagickAllocateResourceLimitedMemory(const size_t size) MAGICK_FUNC_MALLOC MAGICK_FUNC_ALLOC_SIZE_1ARG(1);
 
 extern MagickExport
   void _MagickFreeResourceLimitedMemory(void *p);
@@ -57,7 +57,7 @@
 
 #define MagickAllocateResourceLimitedMemory(type,size)                  \
   ((((size) != ((size_t) (size))) || (size == 0)) ? ((type) 0) :        \
-   ((type) _MagickReallocateResourceLimitedMemory(0,1,(size_t) (size),MagickFalse)))
+   ((type) _MagickAllocateResourceLimitedMemory((size_t) (size))))
 
 #define MagickAllocateResourceLimitedClearedMemory(type,size)           \
   ((((size) != ((size_t) (size))) || (size == 0)) ? ((type) 0) :        \
@@ -127,10 +127,11 @@
 */
 typedef enum _MagickAllocateResourceLimitedMemoryAttribute
   {
-    ResourceLimitedMemoryAttributeAllocSize,
-    ResourceLimitedMemoryAttributeAllocSizeReal,
-    ResourceLimitedMemoryAttributeAllocNumReallocs,
-    ResourceLimitedMemoryAttributeAllocNumReallocsMoved
+    ResourceLimitedMemoryAttributeAllocSize,                /* Currently requested allocation size */
+    ResourceLimitedMemoryAttributeAllocSizeReal,            /* Actual underlying requested allocation size */
+    ResourceLimitedMemoryAttributeAllocNumReallocs,         /* Number of reallocations performed */
+    ResourceLimitedMemoryAttributeAllocNumReallocsMoved,    /* Number of reallocations which moved memory (pointer change) */
+    ResourceLimitedMemoryAttributeAllocReallocOctetsMoved   /* Total octets moved due to reallocations (may overflow!) */
   } MagickAllocateResourceLimitedMemoryAttribute;
 
 /*
@@ -145,6 +146,9 @@
 #define MagickResourceLimitedMemoryGetAllocSizeReal(p) \
   _MagickResourceLimitedMemoryGetSizeAttribute(p, ResourceLimitedMemoryAttributeAllocSizeReal);
 
+/*
+  Given an exisisting allocation, request certain attributes/metrics from it.
+*/
 MagickExport size_t _MagickResourceLimitedMemoryGetSizeAttribute(const void *p,
                                                                  const MagickAllocateResourceLimitedMemoryAttribute attr);
 
diff -r cbfeeef1ceab -r e0e762ead892 magick/memory.c
--- a/magick/memory.c	Mon Dec 27 13:43:38 2021 -0600
+++ b/magick/memory.c	Wed Dec 29 11:17:33 2021 -0600
@@ -589,6 +589,7 @@
   size_t alloc_size_real;       /* Real/underlying allocation size */
   size_t num_realloc;           /* Number of actual reallocations performed */
   size_t num_realloc_moves;     /* Number of reallocations which moved memory */
+  size_t realloc_octets_moved;  /* Number of octets moved by reallocations */
   size_t signature;             /* Initialized to MagickSignature */
 
 } MagickMemoryResource_T;
@@ -623,6 +624,7 @@
         (memory_resource)->alloc_size_real = 0;                         \
         (memory_resource)->num_realloc = 0;                             \
         (memory_resource)->num_realloc_moves = 0;                       \
+        (memory_resource)->realloc_octets_moved = 0;                     \
         (memory_resource)->signature = MagickSignature;                 \
       }                                                                 \
   } while(0)
@@ -662,6 +664,7 @@
   memory_resource->alloc_size = 0;
   memory_resource->num_realloc = 0;
   memory_resource->num_realloc_moves = 0;
+  memory_resource->realloc_octets_moved = 0;
 }
 
 
@@ -752,7 +755,10 @@
                       memory_resource.num_realloc++;
                       /* Tally reallocations which resulted in a memory move */
                       if (realloc_memory != memory_resource.memory)
-                        memory_resource.num_realloc_moves++;
+                        {
+                          memory_resource.num_realloc_moves++;
+                          memory_resource.realloc_octets_moved += memory_resource.alloc_size;
+                        }
                       memory_resource.memory = realloc_memory;
                       memory_resource.alloc_size = new_size;
                       memory_resource.alloc_size_real = realloc_size-sizeof(MagickMemoryResource_T);
@@ -778,7 +784,13 @@
             }
           else
             {
-              /* Acquire memory resource FAILED */
+              /*
+                Acquire memory resource FAILED.  If this was a
+                realloc, it is expected that the original pointer is
+                valid and retained by the user, who will responsibly
+                free it so its resource allocation will be released
+                later.
+              */
 #if defined(ENOMEM)
               errno = ENOMEM;
 #endif /* if defined(ENOMEM) */
@@ -854,13 +866,17 @@
       result = memory_resource.alloc_size_real;
       break;
     case ResourceLimitedMemoryAttributeAllocNumReallocs:
-      /* Number of reallocations performed on buffer */
+      /* Number of reallocations performed */
       result = memory_resource.num_realloc;
       break;
     case ResourceLimitedMemoryAttributeAllocNumReallocsMoved:
-      /* Number of reallocations performed on buffer which moved memory */
+      /* Number of reallocations which moved memory (pointer change) */
       result = memory_resource.num_realloc_moves;
       break;
+    case ResourceLimitedMemoryAttributeAllocReallocOctetsMoved:
+      /* Total number of octets moved due to reallocations (may overflow!) */
+      result = memory_resource.realloc_octets_moved;
+      break;
     }
 
   return result;
diff -r cbfeeef1ceab -r e0e762ead892 magick/version.h
--- a/magick/version.h	Mon Dec 27 13:43:38 2021 -0600
+++ b/magick/version.h	Wed Dec 29 11:17:33 2021 -0600
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x262300
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 26,23,0
-#define MagickChangeDate   "20211227"
-#define MagickReleaseDate  "snapshot-20211227"
+#define MagickChangeDate   "20211229"
+#define MagickReleaseDate  "snapshot-20211229"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r cbfeeef1ceab -r e0e762ead892 www/Changelog.html
--- a/www/Changelog.html	Mon Dec 27 13:43:38 2021 -0600
+++ b/www/Changelog.html	Wed Dec 29 11:17:33 2021 -0600
@@ -35,6 +35,14 @@
 <div class="document">
 
 
+<p>2021-12-29  Bob Friesenhahn  &lt;<a class="reference external" href="mailto:bfriesen&#37;&#52;&#48;simple&#46;dallas&#46;tx&#46;us">bfriesen<span>&#64;</span>simple<span>&#46;</span>dallas<span>&#46;</span>tx<span>&#46;</span>us</a>&gt;</p>
+<blockquote>
+<p>* magick/memory-private.h(_MagickReallocateResourceLimitedMemory)
+: Remove use of GCC/Clang '__attribute_malloc__' since it is not
+appropriate for this function.</p>
+<p>* magick/memory.c (_MagickReallocateResourceLimitedMemory):
+Maintain a tally of the total number of octets moved by realloc.</p>
+</blockquote>
 <p>2021-12-27  Bob Friesenhahn  &lt;<a class="reference external" href="mailto:bfriesen&#37;&#52;&#48;simple&#46;dallas&#46;tx&#46;us">bfriesen<span>&#64;</span>simple<span>&#46;</span>dallas<span>&#46;</span>tx<span>&#46;</span>us</a>&gt;</p>
 <blockquote>
 * coders/mat.c (ReadMATImage): Change 'ldblk' to size_t and
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.