diff --git a/CMakeLists.txt b/CMakeLists.txt index 208a275f..64c8116e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -449,9 +449,16 @@ IF(HAVE_INTRIN_H) }" HAVE_BITSCANFORWARD_INTRINSIC) ENDIF() -CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN) -CHECK_SYMBOL_EXISTS(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC) -CHECK_SYMBOL_EXISTS(proc_pidpath libproc.h HAVE_PROC_PIDPATH) +check_cxx_source_compiles("#include +int main() +{ + void *ptr{std::aligned_alloc(alignof(int), sizeof(int))}; + std::free(ptr); + return 0; +}" HAVE_STD_ALIGNED_ALLOC) +check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN) +check_symbol_exists(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC) +check_symbol_exists(proc_pidpath libproc.h HAVE_PROC_PIDPATH) IF(NOT WIN32) # We need pthreads outside of Windows, for semaphores. It's also used to diff --git a/common/almalloc.cpp b/common/almalloc.cpp index 5b679b75..806cb4ab 100644 --- a/common/almalloc.cpp +++ b/common/almalloc.cpp @@ -17,7 +17,7 @@ void *al_malloc(size_t alignment, size_t size) assert((alignment & (alignment-1)) == 0); alignment = std::max(alignment, alignof(std::max_align_t)); -#if __cplusplus >= 201703L +#if defined(HAVE_STD_ALIGNED_ALLOC) size = (size+(alignment-1))&~(alignment-1); return std::aligned_alloc(alignment, size); #elif defined(HAVE_POSIX_MEMALIGN) @@ -48,7 +48,7 @@ void *al_calloc(size_t alignment, size_t size) void al_free(void *ptr) noexcept { -#if (__cplusplus >= 201703L) || defined(HAVE_POSIX_MEMALIGN) +#if defined(HAVE_STD_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN) std::free(ptr); #elif defined(HAVE__ALIGNED_MALLOC) _aligned_free(ptr); diff --git a/config.h.in b/config.h.in index 29a10b20..75aacc0d 100644 --- a/config.h.in +++ b/config.h.in @@ -8,6 +8,9 @@ /* Define if HRTF data is embedded in the library */ #cmakedefine ALSOFT_EMBED_HRTF_DATA +/* Define if we have the std::aligned_alloc function */ +#cmakedefine HAVE_STD_ALIGNED_ALLOC + /* Define if we have the posix_memalign function */ #cmakedefine HAVE_POSIX_MEMALIGN