/src/FreeImage/Source/LibOpenJPEG/opj_malloc.h
C++ Header | 163 lines | 76 code | 18 blank | 69 comment | 1 complexity | 5e8ff6c5ceba8418632b3cb39d0e0f49 MD5 | raw file
1/* 2 * Copyright (c) 2005, Herve Drolon, FreeImage Team 3 * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 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. 14 * 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. 26 */ 27#ifndef __OPJ_MALLOC_H 28#define __OPJ_MALLOC_H 29/** 30@file opj_malloc.h 31@brief Internal functions 32 33The functions in opj_malloc.h are internal utilities used for memory management. 34*/ 35 36/** @defgroup MISC MISC - Miscellaneous internal functions */ 37/*@{*/ 38 39/** @name Exported functions */ 40/*@{*/ 41/* ----------------------------------------------------------------------- */ 42 43/** 44Allocate 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 47*/ 48#ifdef ALLOC_PERF_OPT 49void * OPJ_CALLCONV opj_malloc(size_t size); 50#else 51#define opj_malloc(size) malloc(size) 52#endif 53 54/** 55Allocate 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 59*/ 60#ifdef ALLOC_PERF_OPT 61void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements); 62#else 63#define opj_calloc(num, size) calloc(num, size) 64#endif 65 66/** 67Allocate 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 70*/ 71/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */ 72#ifdef _WIN32 73 /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */ 74 #ifdef __GNUC__ 75 #include <mm_malloc.h> 76 #define HAVE_MM_MALLOC 77 #else /* MSVC, Intel C++ */ 78 #include <malloc.h> 79 #ifdef _mm_malloc 80 #define HAVE_MM_MALLOC 81 #endif 82 #endif 83#else /* Not _WIN32 */ 84 #if defined(__sun) 85 #define HAVE_MEMALIGN 86 /* Linux x86_64 and OSX always align allocations to 16 bytes */ 87 #elif !defined(__amd64__) && !defined(__APPLE__) 88 #define HAVE_MEMALIGN 89 #include <malloc.h> 90 #endif 91#endif 92 93#define opj_aligned_malloc(size) malloc(size) 94#define opj_aligned_free(m) free(m) 95 96#ifdef HAVE_MM_MALLOC 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) 101#endif 102 103#ifdef HAVE_MEMALIGN 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) 109#endif 110 111#ifdef HAVE_POSIX_MEMALIGN 112 #undef opj_aligned_malloc 113 extern int posix_memalign(void**, size_t, size_t); 114 115 static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){ 116 void* mem = NULL; 117 posix_memalign(&mem, 16, size); 118 return mem; 119 } 120 #undef opj_aligned_free 121 #define opj_aligned_free(m) free(m) 122#endif 123 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) 129#endif 130 131/** 132Reallocate 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 136*/ 137#ifdef ALLOC_PERF_OPT 138void * OPJ_CALLCONV opj_realloc(void * m, size_t s); 139#else 140#define opj_realloc(m, s) realloc(m, s) 141#endif 142 143/** 144Deallocates or frees a memory block. 145@param m Previously allocated memory block to be freed 146*/ 147#ifdef ALLOC_PERF_OPT 148void OPJ_CALLCONV opj_free(void * m); 149#else 150#define opj_free(m) free(m) 151#endif 152 153#ifdef __GNUC__ 154#pragma GCC poison malloc calloc realloc free 155#endif 156 157/* ----------------------------------------------------------------------- */ 158/*@}*/ 159 160/*@}*/ 161 162#endif /* __OPJ_MALLOC_H */ 163