aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2018-01-16 19:24:14 -0800
committerChris Robinson <[email protected]>2018-01-16 19:28:10 -0800
commit3baf9d0e81c16555fc417697a5445b7cd674db02 (patch)
tree3586c9a938ada32394cdc05430332f01da7e6728
parent248832b26680de4ce48bf17076287a07dbd36ff7 (diff)
Add a method to get the system's page size
-rw-r--r--CMakeLists.txt1
-rw-r--r--common/almalloc.c48
-rw-r--r--common/almalloc.h9
-rw-r--r--config.h.in3
4 files changed, 61 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0b07f4ea..dd371f70 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -499,6 +499,7 @@ IF(HAVE_INTRIN_H)
}" HAVE_CPUID_INTRINSIC)
ENDIF()
+CHECK_SYMBOL_EXISTS(sysconf unistd.h HAVE_SYSCONF)
CHECK_SYMBOL_EXISTS(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC)
CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN)
CHECK_SYMBOL_EXISTS(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC)
diff --git a/common/almalloc.c b/common/almalloc.c
index 8c1c5794..0d982ca1 100644
--- a/common/almalloc.c
+++ b/common/almalloc.c
@@ -10,8 +10,20 @@
#endif
#ifdef HAVE_WINDOWS_H
#include <windows.h>
+#else
+#include <unistd.h>
+#endif
+
+
+#ifdef __GNUC__
+#define LIKELY(x) __builtin_expect(!!(x), !0)
+#define UNLIKELY(x) __builtin_expect(!!(x), 0)
+#else
+#define LIKELY(x) (!!(x))
+#define UNLIKELY(x) (!!(x))
#endif
+
void *al_malloc(size_t alignment, size_t size)
{
#if defined(HAVE_ALIGNED_ALLOC)
@@ -60,3 +72,39 @@ void al_free(void *ptr)
}
#endif
}
+
+size_t al_get_page_size(void)
+{
+ static size_t psize = 0;
+ if(UNLIKELY(!psize))
+ {
+#ifdef HAVE_SYSCONF
+#if defined(_SC_PAGESIZE)
+ if(!psize) psize = sysconf(_SC_PAGESIZE);
+#elif defined(_SC_PAGE_SIZE)
+ if(!psize) psize = sysconf(_SC_PAGE_SIZE);
+#endif
+#endif /* HAVE_SYSCONF */
+#ifdef _WIN32
+ if(!psize)
+ {
+ SYSTEM_INFO sysinfo;
+ memset(&sysinfo, 0, sizeof(sysinfo));
+
+ GetSystemInfo(&sysinfo);
+ psize = sysinfo.dwPageSize;
+ }
+#endif
+ if(!psize) psize = DEF_ALIGN;
+ }
+ return psize;
+}
+
+int al_is_sane_alignment_allocator(void)
+{
+#if defined(HAVE_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN) || defined(HAVE__ALIGNED_MALLOC)
+ return 1;
+#else
+ return 0;
+#endif
+}
diff --git a/common/almalloc.h b/common/almalloc.h
index 8eadb5b3..a4297cf5 100644
--- a/common/almalloc.h
+++ b/common/almalloc.h
@@ -14,6 +14,15 @@ void *al_malloc(size_t alignment, size_t size);
void *al_calloc(size_t alignment, size_t size);
void al_free(void *ptr);
+size_t al_get_page_size(void);
+
+/**
+ * Returns non-0 if the allocation function has direct alignment handling.
+ * Otherwise, the standard malloc is used with an over-allocation and pointer
+ * offset strategy.
+ */
+int al_is_sane_alignment_allocator(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/config.h.in b/config.h.in
index 22c3b1c7..0bee5c98 100644
--- a/config.h.in
+++ b/config.h.in
@@ -11,6 +11,9 @@
/* Define if HRTF data is embedded in the library */
#cmakedefine ALSOFT_EMBED_HRTF_DATA
+/* Define if we have the sysconf function */
+#cmakedefine HAVE_SYSCONF
+
/* Define if we have the C11 aligned_alloc function */
#cmakedefine HAVE_ALIGNED_ALLOC