Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2005, HervĂ© 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.  
  33. The 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. /**
  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
  47. */
  48. #ifdef ALLOC_PERF_OPT
  49. void * OPJ_CALLCONV opj_malloc(size_t size);
  50. #else
  51. #define opj_malloc(size) malloc(size)
  52. #endif
  53.  
  54. /**
  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
  59. */
  60. #ifdef ALLOC_PERF_OPT
  61. void * 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. /**
  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
  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. /**
  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
  136. */
  137. #ifdef ALLOC_PERF_OPT
  138. void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
  139. #else
  140. #define opj_realloc(m, s) realloc(m, s)
  141. #endif
  142.  
  143. /**
  144. Deallocates or frees a memory block.
  145. @param m Previously allocated memory block to be freed
  146. */
  147. #ifdef ALLOC_PERF_OPT
  148. void 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.  
  164.