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