From 02c84c6540a428653bd0c5c3efd15ead9ba2411f Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sat, 19 Oct 2019 15:55:18 +0200 Subject: [PATCH] Added SetMagickAlignedMemoryMethods that can be used to set the methods that will be used to acquire and relinquish aligned memory. --- MagickCore/memory.c | 55 ++++++++++++++++++++++++++++++++++++++++++-- MagickCore/memory_.h | 8 +++++-- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/MagickCore/memory.c b/MagickCore/memory.c index 1c92f15da..085a40347 100644 --- a/MagickCore/memory.c +++ b/MagickCore/memory.c @@ -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; } + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% 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; +} diff --git a/MagickCore/memory_.h b/MagickCore/memory_.h index 189c44c18..bacaa9b4a 100644 --- a/MagickCore/memory_.h +++ b/MagickCore/memory_.h @@ -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) } -- 2.50.1