diff --git a/CMakeLists.txt b/CMakeLists.txt index 68814d23..2ef847fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/src/lib/openjp2/opj_malloc.c b/src/lib/openjp2/opj_malloc.c index a170d852..62f7265e 100644 --- a/src/lib/openjp2/opj_malloc.c +++ b/src/lib/openjp2/opj_malloc.c @@ -30,36 +30,34 @@ */ #define OPJ_SKIP_POISON #include "opj_malloc.h" +#include "opj_config_private.h" #include 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)