diff options
author | Chris Robinson <[email protected]> | 2018-01-16 19:24:14 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2018-01-16 19:28:10 -0800 |
commit | 3baf9d0e81c16555fc417697a5445b7cd674db02 (patch) | |
tree | 3586c9a938ada32394cdc05430332f01da7e6728 | |
parent | 248832b26680de4ce48bf17076287a07dbd36ff7 (diff) |
Add a method to get the system's page size
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | common/almalloc.c | 48 | ||||
-rw-r--r-- | common/almalloc.h | 9 | ||||
-rw-r--r-- | config.h.in | 3 |
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 |