summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCameron Cawley <ccawley2011@gmail.com>2022-10-13 14:59:18 +0100
committerHans Kristian Rosbach <hk-github@circlestorm.org>2023-03-17 21:27:56 +0100
commitd2a13a8fd4a0ffc5e25102717d26b30f6e05d092 (patch)
treebcf7f3f0d89f65526f70d711731f375b9862a1a8
parent9316259583da99d9350e63f04144f1c90f130fd3 (diff)
Support using aligned_alloc() for memory allocation
-rw-r--r--CMakeLists.txt6
-rwxr-xr-xconfigure19
-rw-r--r--zbuild.h4
-rw-r--r--zutil_p.h4
4 files changed, 32 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bb29d76..a7c6806 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -388,6 +388,12 @@ if(HAVE_POSIX_MEMALIGN)
add_definitions(-DHAVE_POSIX_MEMALIGN)
endif()
set(CMAKE_REQUIRED_DEFINITIONS)
+set(CMAKE_REQUIRED_DEFINITIONS -D_ISOC11_SOURCE=1)
+check_function_exists(aligned_alloc HAVE_ALIGNED_ALLOC)
+if(HAVE_ALIGNED_ALLOC)
+ add_definitions(-DHAVE_ALIGNED_ALLOC)
+endif()
+set(CMAKE_REQUIRED_DEFINITIONS)
if(WITH_SANITIZER STREQUAL "Address")
add_address_sanitizer()
diff --git a/configure b/configure
index 998ba3c..cc51d21 100755
--- a/configure
+++ b/configure
@@ -750,6 +750,25 @@ else
fi
echo >> configure.log
+cat > $test.c <<EOF
+#define _ISOC11_SOURCE 1
+#include <stdlib.h>
+int main(void) {
+ void *ptr = aligned_alloc(64, 10);
+ if (ptr)
+ free(ptr);
+ return 0;
+}
+EOF
+if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then
+ echo "Checking for aligned_alloc... Yes." | tee -a configure.log
+ CFLAGS="${CFLAGS} -DHAVE_ALIGNED_ALLOC"
+ SFLAGS="${SFLAGS} -DHAVE_ALIGNED_ALLOC"
+else
+ echo "Checking for aligned_alloc... No." | tee -a configure.log
+fi
+echo >> configure.log
+
# check for strerror() for use by gz* functions
cat > $test.c <<EOF
#include <string.h>
diff --git a/zbuild.h b/zbuild.h
index 3c5e5fb..f0f9202 100644
--- a/zbuild.h
+++ b/zbuild.h
@@ -1,6 +1,10 @@
#ifndef _ZBUILD_H
#define _ZBUILD_H
+#ifndef _ISOC11_SOURCE
+# define _ISOC11_SOURCE 1 /* aligned_alloc */
+#endif
+
/* This has to be first include that defines any types */
#if defined(_MSC_VER)
# if defined(_WIN64)
diff --git a/zutil_p.h b/zutil_p.h
index 55f0061..856b44f 100644
--- a/zutil_p.h
+++ b/zutil_p.h
@@ -9,7 +9,7 @@
# define _POSIX_C_SOURCE 200112L /* For posix_memalign(). */
#endif
-#if defined(__APPLE__) || defined(HAVE_POSIX_MEMALIGN)
+#if defined(__APPLE__) || defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_ALIGNED_ALLOC)
# include <stdlib.h>
#elif defined(__FreeBSD__)
# include <stdlib.h>
@@ -27,6 +27,8 @@ static inline void *zng_alloc(size_t size) {
return (void *)_aligned_malloc(size, 64);
#elif defined(__APPLE__)
return (void *)malloc(size); /* MacOS always aligns to 16 bytes */
+#elif defined(HAVE_ALIGNED_ALLOC)
+ return (void *)aligned_alloc(64, size);
#else
return (void *)memalign(64, size);
#endif