]> granicus.if.org Git - imagemagick/commitdiff
Added SetMagickAlignedMemoryMethods that can be used to set the methods that will...
authorDirk Lemstra <dirk@lemstra.org>
Sat, 19 Oct 2019 13:55:18 +0000 (15:55 +0200)
committerDirk Lemstra <dirk@lemstra.org>
Sat, 19 Oct 2019 13:55:18 +0000 (15:55 +0200)
MagickCore/memory.c
MagickCore/memory_.h

index 1c92f15da3eec5246bcb6eff3d4e5389d99ae05f..085a40347b8d1befbc9e15d0ea8d7b1290365671 100644 (file)
@@ -126,6 +126,12 @@ typedef struct _MagickMemoryMethods
 
   DestroyMemoryHandler
     destroy_memory_handler;
+
+  AcquireAlignedMemoryHandler
+    acquire_aligned_memory_handler;
+
+  RelinquishAlignedMemoryHandler
+    relinquish_aligned_memory_handler;
 } MagickMemoryMethods;
 
 struct _MemoryInfo
@@ -190,12 +196,14 @@ static MagickMemoryMethods
 #if defined _MSC_VER
     (AcquireMemoryHandler) MSCMalloc,
     (ResizeMemoryHandler) MSCRealloc,
-    (DestroyMemoryHandler) MSCFree
+    (DestroyMemoryHandler) MSCFree,
 #else
     (AcquireMemoryHandler) malloc,
     (ResizeMemoryHandler) realloc,
-    (DestroyMemoryHandler) free
+    (DestroyMemoryHandler) free,
 #endif
+    (AcquireAlignedMemoryHandler) NULL,
+    (RelinquishAlignedMemoryHandler) NULL
   };
 #if defined(MAGICKCORE_ANONYMOUS_MEMORY_SUPPORT)
 static MemoryPool
@@ -261,6 +269,8 @@ MagickExport void *AcquireAlignedMemory(const size_t count,const size_t quantum)
   extent=AlignedExtent(size,alignment);
   if ((size == 0) || (extent < size))
     return((void *) NULL);
+  if (memory_methods.acquire_aligned_memory_handler != (AcquireAlignedMemoryHandler) NULL)
+    return(memory_methods.acquire_aligned_memory_handler(extent,alignment));
 #if defined(MAGICKCORE_HAVE_POSIX_MEMALIGN)
   if (posix_memalign(&memory,alignment,extent) != 0)
     memory=NULL;
@@ -1033,6 +1043,11 @@ MagickExport void *RelinquishAlignedMemory(void *memory)
 {
   if (memory == (void *) NULL)
     return((void *) NULL);
+  if (memory_methods.relinquish_aligned_memory_handler != (RelinquishAlignedMemoryHandler) NULL)
+    {
+      memory_methods.relinquish_aligned_memory_handler(memory);
+      return(NULL);
+    }
 #if defined(MAGICKCORE_HAVE_POSIX_MEMALIGN)
   free(memory);
 #elif defined(MAGICKCORE_HAVE__ALIGNED_MALLOC)
@@ -1411,3 +1426,39 @@ MagickExport void SetMagickMemoryMethods(
   if (destroy_memory_handler != (DestroyMemoryHandler) NULL)
     memory_methods.destroy_memory_handler=destroy_memory_handler;
 }
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   S e t M a g i c k A l i g n e d M e m o r y M e t h o d s                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  SetMagickAlignedMemoryMethods() sets the methods to acquire and relinquish
+%  aligned memory.
+%
+%  The format of the SetMagickAlignedMemoryMethods() method is:
+%
+%      SetMagickAlignedMemoryMethods(
+%        AcquireAlignedMemoryHandler acquire_aligned_memory_handler,
+%        RelinquishAlignedMemoryHandler relinquish_aligned_memory_handler)
+%
+%  A description of each parameter follows:
+%
+%    o acquire_memory_handler: method to acquire aligned memory.
+%
+%    o relinquish_aligned_memory_handler: method to relinquish aligned memory.
+%
+*/
+MagickExport void SetMagickAlignedMemoryMethods(
+  AcquireAlignedMemoryHandler acquire_aligned_memory_handler,
+  RelinquishAlignedMemoryHandler relinquish_aligned_memory_handler)
+{
+  memory_methods.acquire_aligned_memory_handler=acquire_aligned_memory_handler;
+  memory_methods.relinquish_aligned_memory_handler=
+      relinquish_aligned_memory_handler;
+}
index 189c44c180a79c93fa2eb652576155d736bb2d2c..bacaa9b4ab087e1ab09bf66328e547ec7fee7268 100644 (file)
@@ -28,7 +28,9 @@ typedef struct _MemoryInfo
 typedef void
   *(*AcquireMemoryHandler)(size_t) magick_alloc_size(1),
   (*DestroyMemoryHandler)(void *),
-  *(*ResizeMemoryHandler)(void *,size_t) magick_alloc_size(2);
+  *(*ResizeMemoryHandler)(void *,size_t) magick_alloc_size(2),
+  *(*AcquireAlignedMemoryHandler)(const size_t,const size_t),
+  (*RelinquishAlignedMemoryHandler)(void *);
 
 extern MagickExport MemoryInfo
   *AcquireVirtualMemory(const size_t,const size_t) magick_alloc_sizes(1,2),
@@ -55,7 +57,9 @@ extern MagickExport void
   *ResizeQuantumMemory(void *,const size_t,const size_t)
     magick_attribute((__malloc__)) magick_alloc_sizes(2,3),
   SetMagickMemoryMethods(AcquireMemoryHandler,ResizeMemoryHandler,
-    DestroyMemoryHandler);
+    DestroyMemoryHandler),
+  SetMagickAlignedMemoryMethods(AcquireAlignedMemoryHandler,
+    RelinquishAlignedMemoryHandler);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }