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 /common | |
parent | 248832b26680de4ce48bf17076287a07dbd36ff7 (diff) |
Add a method to get the system's page size
Diffstat (limited to 'common')
-rw-r--r-- | common/almalloc.c | 48 | ||||
-rw-r--r-- | common/almalloc.h | 9 |
2 files changed, 57 insertions, 0 deletions
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 |