do not use aligned_alloc since it requires c11
authorMathieu Malaterre <mathieu.malaterre@gmail.com>
Sat, 10 Oct 2015 12:54:21 +0000 (14:54 +0200)
committerMathieu Malaterre <mathieu.malaterre@gmail.com>
Sat, 10 Oct 2015 12:54:21 +0000 (14:54 +0200)
CMakeLists.txt
src/lib/openjp2/opj_malloc.c

index 68814d231f87fb16075c9f8cd0fde3e37234d9ff..2ef847fece1763195b5bbccb3352d8e1e5300f0f 100644 (file)
@@ -225,20 +225,16 @@ CHECK_INCLUDE_FILE("unistd.h"       HAVE_UNISTD_H)
 include(TestLargeFiles)
 OPJ_TEST_LARGE_FILES(OPJ_HAVE_LARGEFILES)
 
+# Allocating Aligned Memory Blocks
 include(CheckIncludeFiles)
 check_include_files(malloc.h HAVE_MALLOC_H)
 include(CheckSymbolExists)
-# aligned_alloc
-set(CMAKE_REQUIRED_FLAGS "-std=c11")
-check_symbol_exists(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC)
-unset(CMAKE_REQUIRED_FLAGS)
 # _aligned_alloc https://msdn.microsoft.com/en-us/library/8z34s9c6.aspx
 check_symbol_exists(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC)
-# memalign
-check_symbol_exists(memalign malloc.h HAVE_MEMALIGN)
 # posix_memalign
 check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN)
-
+# memalign (obsolete)
+check_symbol_exists(memalign malloc.h HAVE_MEMALIGN)
 #-----------------------------------------------------------------------------
 # Build Library
 if(BUILD_JPIP_SERVER)
index a170d8527c475244a044a5b706b83ee677aec947..62f7265e0adc1901c71b89dfc8e55a36785b8130 100644 (file)
  */
 #define OPJ_SKIP_POISON
 #include "opj_malloc.h"
+#include "opj_config_private.h"
 #include <stdlib.h>
 
 static inline void *opj_aligned_alloc(size_t alignment, size_t size)
 {
-#ifndef HAVE_ALIGNED_ALLOC
-  /* older linux */
-#ifdef HAVE_MEMALIGN
-  assert( size % alignment == 0 );
-  return memalign( alignment, size );
-#endif /* HAVE_MEMALIGN */
-
-/* _MSC_VER */
-#ifdef HAVE__ALIGNED_MALLOC
-  return _aligned_malloc( alignment, size );
-#endif /* HAVE__ALIGNED_MALLOC */
-
 /* MacOSX / clang */
-#if defined(HAVE_POSIX_MEMALIGN) && !defined(HAVE_MEMALIGN)
+#if defined(HAVE_POSIX_MEMALIGN)
+  // aligned_alloc requires c11, restrict to posix_memalign for now. Quote:
+  // This function was introduced in POSIX 1003.1d. Although this function is
+  // superseded by aligned_alloc, it is more portable to older POSIX systems
+  // that do not support ISO C11.
   void* ptr;
   if (posix_memalign (&ptr, alignment, size))
   {
     ptr = NULL;
   }
   return ptr;
-#endif /* HAVE_POSIX_MEMALIGN */
-
-#else /* HAVE_ALIGNED_ALLOC */
-  return aligned_alloc( alignment, size );
-#endif /* HAVE_ALIGNED_ALLOC */
+  /* older linux */
+#elif defined(HAVE_MEMALIGN)
+  assert( size % alignment == 0 );
+  return memalign( alignment, size );
+/* _MSC_VER */
+#elif defined(HAVE__ALIGNED_MALLOC)
+  return _aligned_malloc( alignment, size );
+#else
 /* TODO: _mm_malloc(x,y) */
+#error missing aligned alloc function
+#endif
 }
 
 void * opj_malloc(size_t size)
@@ -74,7 +72,7 @@ void * opj_calloc(size_t numOfElements, size_t sizeOfElements)
 
 void *opj_aligned_malloc(size_t size)
 {
-  return opj_aligned_alloc(size,16);
+  return opj_aligned_alloc(16u,size);
 }
 
 void opj_aligned_free(void* ptr)