1 /* 2 Copyright (C) 2003-2020 GraphicsMagick Group 3 4 This program is covered by multiple licenses, which are described in 5 Copyright.txt. You should have received a copy of Copyright.txt with this 6 package; otherwise see http://www.graphicsmagick.org/www/Copyright.html. 7 8 GraphicsMagick Memory Allocation Methods. 9 */ 10 11 extern MagickExport void 12 *MagickMallocAlignedArray(const size_t alignment,const size_t count,const size_t size) MAGICK_FUNC_MALLOC MAGICK_FUNC_ALLOC_SIZE_2ARG(2,3), 13 *MagickMallocArray(const size_t count,const size_t size) MAGICK_FUNC_MALLOC MAGICK_FUNC_ALLOC_SIZE_2ARG(1,2); 14 15 extern MagickExport size_t 16 MagickArraySize(const size_t count,const size_t size) MAGICK_FUNC_CONST; 17 18 extern MagickExport 19 void *_MagickReallocateResourceLimitedMemory(void *p,const size_t count,const size_t size,const MagickBool clear); 20 21 extern MagickExport 22 void *_MagickAllocateResourceLimitedMemory(const size_t size); 23 24 extern MagickExport 25 void _MagickFreeResourceLimitedMemory(void *p); 26 27 28 /* 29 Allocate memory 30 */ 31 #define MagickAllocateMemory(type,size) \ 32 ((((size) != ((size_t) (size))) || (size == 0)) ? ((type) 0) : \ 33 ((type) MagickMalloc((size_t) (size)))) 34 35 #define MagickAllocateClearedMemory(type,size) \ 36 ((((size) != ((size_t) (size))) || (size == 0)) ? ((type) 0) : \ 37 ((type) MagickMallocCleared((size_t) (size)))) 38 39 #define MagickAllocateArray(type,count,size) \ 40 ((type) MagickMallocArray(count,size)) 41 42 #define MagickAllocateClearedArray(type,count,size) \ 43 ((type) MagickMallocCleared(MagickArraySize(count,size))) 44 /* 45 Free memory and set pointer to NULL 46 */ 47 #define MagickFreeMemory(memory) \ 48 { \ 49 void *_magick_mp=memory; \ 50 MagickFree(_magick_mp); \ 51 memory=0; \ 52 } 53 54 /* 55 Allocate/Reallocate/Free memory (resource limited) 56 */ 57 #define MagickAllocateResourceLimitedMemory(type,size) \ 58 ((((size) != ((size_t) (size))) || (size == 0)) ? ((type) 0) : \ 59 ((type) _MagickReallocateResourceLimitedMemory(0,1,(size_t) (size),MagickFalse))) 60 61 #define MagickAllocateResourceLimitedClearedMemory(type,size) \ 62 ((((size) != ((size_t) (size))) || (size == 0)) ? ((type) 0) : \ 63 ((type) _MagickReallocateResourceLimitedMemory(0,1,(size_t) (size),MagickTrue))) 64 65 #define MagickAllocateResourceLimitedArray(type,count,size) \ 66 ((type) _MagickReallocateResourceLimitedMemory(0,(size_t) (count),(size_t) (size),MagickFalse)) 67 68 #define MagickAllocateResourceLimitedClearedArray(type,count,size) \ 69 ((type) _MagickReallocateResourceLimitedMemory(0,(size_t) (count),(size_t) (size),MagickTrue)) 70 71 #define MagickReallocateResourceLimitedMemory(type,memory,size) \ 72 ((type) _MagickReallocateResourceLimitedMemory(memory,1,(size_t) (size),MagickFalse)) 73 74 #define MagickReallocateResourceLimitedArray(type,memory,count,size) \ 75 ((type) _MagickReallocateResourceLimitedMemory(memory,(size_t) (count),(size_t) (size),MagickFalse)) 76 77 #define MagickReallocateResourceLimitedClearedArray(type,memory,count,size) \ 78 ((type) _MagickReallocateResourceLimitedMemory(memory,(size_t) (count),(size_t) (size),MagickTrue)) 79 80 #define MagickFreeResourceLimitedMemory(memory) \ 81 memory=_MagickReallocateResourceLimitedMemory(memory,0,0,MagickFalse); 82 83 /* 84 Reallocate memory using provided pointer. If reallocation fails 85 then free memory, setting pointer to null. If size is 0 and memory 86 is not a null pointer, then free memory. This interface behaves 87 similar to realloc() except that memory is always freed (and pointer 88 set to null) if a memory allocation failure occurs. 89 */ 90 #define MagickReallocMemory(type,memory,size) \ 91 { \ 92 size_t _new_size = (size_t) (size); \ 93 void *_magick_mp = MagickRealloc(memory,_new_size); \ 94 memory=(type) _magick_mp; \ 95 } 96 97 /* 98 Allocate memory aligned to a specified alignment boundary 99 */ 100 #define MagickAllocateAlignedMemory(type,alignment,size) \ 101 ((((size) != ((size_t) (size))) || (size == 0)) ? ((type) 0) : \ 102 ((type) MAGICK_ASSUME_ALIGNED(MagickMallocAligned((size_t) alignment, (size_t) (size)),alignment))) 103 104 /* 105 Allocate array aligned to a specified alignment boundary 106 */ 107 #define MagickAllocateAlignedArray(type,alignment,count,size) \ 108 ((((size) != ((size_t) (size))) || (size == 0)) ? ((type) 0) : \ 109 ((type) MAGICK_ASSUME_ALIGNED(MagickMallocAlignedArray((size_t) alignment, (size_t) (count), (size_t) (size)),alignment))) 110 111 /* 112 Free aligned memory (from MagickAllocateAlignedMemory()) and set pointer to 113 NULL 114 */ 115 #define MagickFreeAlignedMemory(memory) \ 116 { \ 117 void *_magick_mp=memory; \ 118 MagickFreeAligned(_magick_mp); \ 119 memory=0; \ 120 } 121 122 /* 123 * Local Variables: 124 * mode: c 125 * c-basic-offset: 2 126 * fill-column: 78 127 * End: 128 */ 129