void *
xmalloc_cacheline(size_t size)
{
+#ifdef HAVE_POSIX_MEMALIGN
+ void *p;
+ int error;
+
+ COVERAGE_INC(util_xalloc);
+ error = posix_memalign(&p, CACHE_LINE_SIZE, size ? size : 1);
+ if (error != 0) {
+ out_of_memory();
+ }
+ return p;
+#else
void **payload;
void *base;
*payload = base;
return (char *) payload + MEM_ALIGN;
+#endif
}
/* Like xmalloc_cacheline() but clears the allocated memory to all zero
void
free_cacheline(void *p)
{
+#ifdef HAVE_POSIX_MEMALIGN
+ free(p);
+#else
if (p) {
free(*(void **) ((uintptr_t) p - MEM_ALIGN));
}
+#endif
}
char *
--- /dev/null
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_func_posix_memalign.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_FUNC_POSIX_MEMALIGN
+#
+# DESCRIPTION
+#
+# Some versions of posix_memalign (notably glibc 2.2.5) incorrectly apply
+# their power-of-two check to the size argument, not the alignment
+# argument. AX_FUNC_POSIX_MEMALIGN defines HAVE_POSIX_MEMALIGN if the
+# power-of-two check is correctly applied to the alignment argument.
+#
+# LICENSE
+#
+# Copyright (c) 2008 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. This file is offered as-is, without any
+# warranty.
+
+#serial 7
+
+AC_DEFUN([AX_FUNC_POSIX_MEMALIGN],
+[AC_CACHE_CHECK([for working posix_memalign],
+ [ax_cv_func_posix_memalign_works],
+ [AC_TRY_RUN([
+#include <stdlib.h>
+
+int
+main ()
+{
+ void *buffer;
+
+ /* Some versions of glibc incorrectly perform the alignment check on
+ * the size word. */
+ exit (posix_memalign (&buffer, sizeof(void *), 123) != 0);
+}
+ ],
+ [ax_cv_func_posix_memalign_works=yes],
+ [ax_cv_func_posix_memalign_works=no],
+ [ax_cv_func_posix_memalign_works=no])])
+if test "$ax_cv_func_posix_memalign_works" = "yes" ; then
+ AC_DEFINE([HAVE_POSIX_MEMALIGN], [1],
+ [Define to 1 if `posix_memalign' works.])
+fi
+])