2
* Copyright (c) 2005, Herve Drolon, FreeImage Team
3
* Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
15
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
16
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
* POSSIBILITY OF SUCH DAMAGE.
27
#ifndef __OPJ_MALLOC_H
28
#define __OPJ_MALLOC_H
31
@brief Internal functions
33
The functions in opj_malloc.h are internal utilities used for memory management.
36
/** @defgroup MISC MISC - Miscellaneous internal functions */
39
/** @name Exported functions */
41
/* ----------------------------------------------------------------------- */
44
Allocate an uninitialized memory block
45
@param size Bytes to allocate
46
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
49
void * OPJ_CALLCONV opj_malloc(size_t size);
51
#define opj_malloc(size) malloc(size)
55
Allocate a memory block with elements initialized to 0
56
@param num Blocks to allocate
57
@param size Bytes per block to allocate
58
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
61
void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
63
#define opj_calloc(num, size) calloc(num, size)
67
Allocate memory aligned to a 16 byte boundry
68
@param size Bytes to allocate
69
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
71
/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
73
/* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
75
#include <mm_malloc.h>
76
#define HAVE_MM_MALLOC
77
#else /* MSVC, Intel C++ */
80
#define HAVE_MM_MALLOC
83
#else /* Not _WIN32 */
86
/* Linux x86_64 and OSX always align allocations to 16 bytes */
87
#elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX) && !defined(__FreeBSD__)
93
#define opj_aligned_malloc(size) malloc(size)
94
#define opj_aligned_free(m) free(m)
97
#undef opj_aligned_malloc
98
#define opj_aligned_malloc(size) _mm_malloc(size, 16)
99
#undef opj_aligned_free
100
#define opj_aligned_free(m) _mm_free(m)
104
extern void* memalign(size_t, size_t);
105
#undef opj_aligned_malloc
106
#define opj_aligned_malloc(size) memalign(16, (size))
107
#undef opj_aligned_free
108
#define opj_aligned_free(m) free(m)
111
#ifdef HAVE_POSIX_MEMALIGN
112
#undef opj_aligned_malloc
113
extern int posix_memalign(void**, size_t, size_t);
115
static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
117
posix_memalign(&mem, 16, size);
120
#undef opj_aligned_free
121
#define opj_aligned_free(m) free(m)
124
#ifdef ALLOC_PERF_OPT
125
#undef opj_aligned_malloc
126
#define opj_aligned_malloc(size) opj_malloc(size)
127
#undef opj_aligned_free
128
#define opj_aligned_free(m) opj_free(m)
132
Reallocate memory blocks.
133
@param m Pointer to previously allocated memory block
134
@param s New size in bytes
135
@return Returns a void pointer to the reallocated (and possibly moved) memory block
137
#ifdef ALLOC_PERF_OPT
138
void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
140
#define opj_realloc(m, s) realloc(m, s)
144
Deallocates or frees a memory block.
145
@param m Previously allocated memory block to be freed
147
#ifdef ALLOC_PERF_OPT
148
void OPJ_CALLCONV opj_free(void * m);
150
#define opj_free(m) free(m)
154
#pragma GCC poison malloc calloc realloc free
157
/* ----------------------------------------------------------------------- */
162
#endif /* __OPJ_MALLOC_H */