00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef __OPJ_MALLOC_H
00033 #define __OPJ_MALLOC_H
00034
00043
00046
00047
00053 #ifdef ALLOC_PERF_OPT
00054 void * OPJ_CALLCONV opj_malloc(size_t size);
00055 #else
00056
00057 #ifdef _MSC_VER
00058 #define opj_malloc(size) ((size_t)(size) >= (size_t)-0x100 ? NULL : malloc(size))
00059 #else
00060 #define opj_malloc(size) malloc(size)
00061 #endif
00062 #endif
00063
00070 #ifdef ALLOC_PERF_OPT
00071 void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
00072 #else
00073
00074 #ifdef _MSC_VER
00075 #define opj_calloc(num, size) ((size_t)(num) != 0 && (size_t)(num) >= (size_t)-0x100 / (size_t)(size) ? NULL : calloc(num, size))
00076 #else
00077 #define opj_calloc(num, size) calloc(num, size)
00078 #endif
00079 #endif
00080
00086
00087 #ifdef _WIN32
00088
00089 #ifdef __GNUC__
00090 #include <mm_malloc.h>
00091 #define HAVE_MM_MALLOC
00092 #else
00093 #include <malloc.h>
00094 #ifdef _mm_malloc
00095 #define HAVE_MM_MALLOC
00096 #endif
00097 #endif
00098 #else
00099 #if defined(__sun)
00100 #define HAVE_MEMALIGN
00101 #elif defined(__FreeBSD__)
00102 #define HAVE_POSIX_MEMALIGN
00103
00104 #elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)
00105 #define HAVE_MEMALIGN
00106 #include <malloc.h>
00107 #endif
00108 #endif
00109
00110 #define opj_aligned_malloc(size) malloc(size)
00111 #define opj_aligned_free(m) free(m)
00112
00113 #ifdef HAVE_MM_MALLOC
00114 #undef opj_aligned_malloc
00115 #define opj_aligned_malloc(size) _mm_malloc(size, 16)
00116 #undef opj_aligned_free
00117 #define opj_aligned_free(m) _mm_free(m)
00118 #endif
00119
00120 #ifdef HAVE_MEMALIGN
00121 extern void* memalign(size_t, size_t);
00122 #undef opj_aligned_malloc
00123 #define opj_aligned_malloc(size) memalign(16, (size))
00124 #undef opj_aligned_free
00125 #define opj_aligned_free(m) free(m)
00126 #endif
00127
00128 #ifdef HAVE_POSIX_MEMALIGN
00129 #undef opj_aligned_malloc
00130 extern int posix_memalign(void**, size_t, size_t);
00131
00132 static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
00133 void* mem = NULL;
00134 posix_memalign(&mem, 16, size);
00135 return mem;
00136 }
00137 #undef opj_aligned_free
00138 #define opj_aligned_free(m) free(m)
00139 #endif
00140
00141 #ifdef ALLOC_PERF_OPT
00142 #undef opj_aligned_malloc
00143 #define opj_aligned_malloc(size) opj_malloc(size)
00144 #undef opj_aligned_free
00145 #define opj_aligned_free(m) opj_free(m)
00146 #endif
00147
00154 #ifdef ALLOC_PERF_OPT
00155 void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
00156 #else
00157
00158 #ifdef _MSC_VER
00159 #define opj_realloc(m, s) ((size_t)(s) >= (size_t)-0x100 ? NULL : realloc(m, s))
00160 #else
00161 #define opj_realloc(m, s) realloc(m, s)
00162 #endif
00163 #endif
00164
00169 #ifdef ALLOC_PERF_OPT
00170 void OPJ_CALLCONV opj_free(void * m);
00171 #else
00172 #define opj_free(m) free(m)
00173 #endif
00174
00175 #ifdef __GNUC__
00176 #pragma GCC poison malloc calloc realloc free
00177 #endif
00178
00179
00183
00184 #endif
00185