Subversion Repositories Kolibri OS

Rev

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.  
  85.         #if defined(__sun)
  86.                 #define HAVE_MEMALIGN
  87.         /* Linux x86_64 and OSX always align allocations to 16 bytes */
  88.         #elif !defined(__amd64__) && !defined(__APPLE__)       
  89. //              #define HAVE_MEMALIGN
  90.                 #include <malloc.h>                    
  91.         #endif
  92. #endif
  93.  
  94. #define opj_aligned_malloc(size) malloc(size)
  95. #define opj_aligned_free(m) free(m)
  96.  
  97. #ifdef HAVE_MM_MALLOC
  98.         #undef opj_aligned_malloc
  99.         #define opj_aligned_malloc(size) _mm_malloc(size, 16)
  100.         #undef opj_aligned_free
  101.         #define opj_aligned_free(m) _mm_free(m)
  102. #endif
  103.  
  104. #undef HAVE_MEMALIGN
  105. #ifdef HAVE_MEMALIGN
  106.         extern void* memalign(size_t, size_t);
  107.         #undef opj_aligned_malloc
  108.         #define opj_aligned_malloc(size) memalign(16, (size))
  109.         #undef opj_aligned_free
  110.         #define opj_aligned_free(m) free(m)
  111. #endif
  112.  
  113. #undef HAVE_POSIX_MEMALIGN
  114. #ifdef HAVE_POSIX_MEMALIGN
  115.         #undef opj_aligned_malloc
  116.         extern int posix_memalign(void**, size_t, size_t);
  117.  
  118.         static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
  119.                 void* mem = NULL;
  120.                 posix_memalign(&mem, 16, size);
  121.                 return mem;
  122.         }
  123.         #undef opj_aligned_free
  124.         #define opj_aligned_free(m) free(m)
  125. #endif
  126.  
  127. #ifdef ALLOC_PERF_OPT
  128.         #undef opj_aligned_malloc
  129.         #define opj_aligned_malloc(size) opj_malloc(size)
  130.         #undef opj_aligned_free
  131.         #define opj_aligned_free(m) opj_free(m)
  132. #endif
  133.  
  134. /**
  135. Reallocate memory blocks.
  136. @param m Pointer to previously allocated memory block
  137. @param s New size in bytes
  138. @return Returns a void pointer to the reallocated (and possibly moved) memory block
  139. */
  140. #ifdef ALLOC_PERF_OPT
  141. void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
  142. #else
  143. #define opj_realloc(m, s) realloc(m, s)
  144. #endif
  145.  
  146. /**
  147. Deallocates or frees a memory block.
  148. @param m Previously allocated memory block to be freed
  149. */
  150. #ifdef ALLOC_PERF_OPT
  151. void OPJ_CALLCONV opj_free(void * m);
  152. #else
  153. #define opj_free(m) free(m)
  154. #endif
  155.  
  156. #ifdef __GNUC__
  157. #pragma GCC poison malloc calloc realloc free
  158. #endif
  159.  
  160. /* ----------------------------------------------------------------------- */
  161. /*@}*/
  162.  
  163. /*@}*/
  164.  
  165. #endif /* __OPJ_MALLOC_H */
  166.  
  167.