diff options
author | Peter Simons <simons@cryp.to> | 2007-02-18 23:43:16 +0100 |
---|---|---|
committer | Peter Simons <simons@cryp.to> | 2007-02-18 23:43:16 +0100 |
commit | 16aee45643e593e2833e4dff19df7b5f14267a79 (patch) | |
tree | ba40c1ee401bbbcec7dbee5e3bb51d21c70db130 /m4/ax_check_page_aligned_malloc.m4 | |
download | autoconf-archive-16aee45643e593e2833e4dff19df7b5f14267a79.tar.gz |
Imported http://autoconf-archive.cryp.to/ release 2007-02-14.
Diffstat (limited to 'm4/ax_check_page_aligned_malloc.m4')
-rw-r--r-- | m4/ax_check_page_aligned_malloc.m4 | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/m4/ax_check_page_aligned_malloc.m4 b/m4/ax_check_page_aligned_malloc.m4 new file mode 100644 index 0000000..5873d86 --- /dev/null +++ b/m4/ax_check_page_aligned_malloc.m4 @@ -0,0 +1,70 @@ +##### http://autoconf-archive.cryp.to/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 probabalistic +# 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. +# +# LAST MODIFICATION +# +# 2005-01-22 +# +# COPYLEFT +# +# Copyright (c) 2005 Scott Pakin <pakin@uiuc.edu> +# +# 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. + +AC_DEFUN([AX_CHECK_PAGE_ALIGNED_MALLOC], +[AC_CACHE_CHECK([if large mallocs guarantee page-alignment], + [ax_cv_func_malloc_aligned], + [AC_TRY_RUN([ +#include <stdio.h> +#include <stdlib.h> +#if HAVE_UNISTD_H +# include <unistd.h> +#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 +]) |