summaryrefslogtreecommitdiff
path: root/m4/ax_check_page_aligned_malloc.m4
diff options
context:
space:
mode:
authorPeter Simons <simons@cryp.to>2007-02-18 23:43:16 +0100
committerPeter Simons <simons@cryp.to>2007-02-18 23:43:16 +0100
commit16aee45643e593e2833e4dff19df7b5f14267a79 (patch)
treeba40c1ee401bbbcec7dbee5e3bb51d21c70db130 /m4/ax_check_page_aligned_malloc.m4
downloadautoconf-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.m470
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
+])