# ================================================================================= # https://www.gnu.org/software/autoconf-archive/ax_check_page_aligned_malloc.html # ================================================================================= # # SYNOPSIS # # AX_CHECK_PAGE_ALIGNED_MALLOC # # DESCRIPTION # # Some operating systems (generally, BSD Unix variants) lack a # posix_memalign function, a memalign function, and a working (meaning, # the memory can be freed) valloc function. To make up for it, the malloc # function promises to return page-aligned addresses if more than one # page's worth of memory is allocated. AX_CHECK_PAGE_ALIGNED_MALLOC checks # for this condition and defines HAVE_PAGE_ALIGNED_MALLOC if the condition # holds. # # As an aside, note that valloc'd memory cannot safely be freed on all # operating systems. (Again, some flavors of BSD are the troublemakers.) # It's best to avoid using valloc in favor of posix_memalign, memalign, or # an aligned malloc as detected by AX_CHECK_PAGE_ALIGNED_MALLOC. # # Caveat: AX_CHECK_PAGE_ALIGNED_MALLOC takes a probabilistic approach. If # 100 calls to malloc all return page-aligned addresses, it assumes that # all calls will behave likewise. It is therefore possible -- albeit # extremely unlikely -- that AX_CHECK_PAGE_ALIGNED_MALLOC can return a # false positive. # # LICENSE # # Copyright (c) 2008 Scott Pakin # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 AC_DEFUN([AX_CHECK_PAGE_ALIGNED_MALLOC], [AC_CACHE_CHECK([if large mallocs guarantee page-alignment], [ax_cv_func_malloc_aligned], [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #if HAVE_UNISTD_H # include #endif int main() { int pagesize = getpagesize(); int i; for (i=0; i<100; i++) if ((unsigned long)malloc(pagesize+1) & (pagesize-1)) exit (1); exit (0); } ]])], [ax_cv_func_malloc_aligned=yes], [ax_cv_func_malloc_aligned=no], [ax_cv_func_malloc_aligned=no]) ]) if test "$ax_cv_func_malloc_aligned" = yes ; then AC_DEFINE([HAVE_PAGE_ALIGNED_MALLOC], [1], [Define if `malloc'ing more than one page always returns a page-aligned address.]) fi ])