Add a method to get the system's page size

This commit is contained in:
Chris Robinson 2018-01-16 19:24:14 -08:00
parent 248832b266
commit 3baf9d0e81
4 changed files with 61 additions and 0 deletions

View File

@ -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)

View File

@ -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
}

View File

@ -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

View File

@ -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