+Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: only use posix_memalign() if it's known to work,
+ revert to memalign() otherwise.
+
+ * configure.in: check for broken posix_memalign() implementations
+ to fix #328254.
+
2006-01-24 Matthias Clasen <mclasen@redhat.com>
* tests/unicode-encoding.c: Use UTF-16LE as target encoding
+Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: only use posix_memalign() if it's known to work,
+ revert to memalign() otherwise.
+
+ * configure.in: check for broken posix_memalign() implementations
+ to fix #328254.
+
2006-01-24 Matthias Clasen <mclasen@redhat.com>
* tests/unicode-encoding.c: Use UTF-16LE as target encoding
+Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: only use posix_memalign() if it's known to work,
+ revert to memalign() otherwise.
+
+ * configure.in: check for broken posix_memalign() implementations
+ to fix #328254.
+
2006-01-24 Matthias Clasen <mclasen@redhat.com>
* tests/unicode-encoding.c: Use UTF-16LE as target encoding
dnl ****************************************
+dnl *** posix_memalign ***
+dnl ****************************************
+AC_MSG_CHECKING(for a compliant posix_memalign() implementation)
+AC_CACHE_VAL(glib_cv_compliant_posix_memalign,[
+ glib_cv_compliant_posix_memalign=0
+ if test "$ac_cv_func_posix_memalign" = "yes" ; then
+ AC_TRY_RUN([
+ #define _XOPEN_SOURCE 600
+ #include <stdlib.h>
+ #include <malloc.h>
+ static void test_memalign (size_t boundary, size_t size) {
+ void *mem = 0;
+ if (posix_memalign (&mem, boundary, size) != 0 || !mem)
+ exit (1);
+ }
+ int main() {
+ test_memalign ( 128, 128 - 2 * sizeof (void*));
+ test_memalign ( 256, 256 - 2 * sizeof (void*));
+ test_memalign ( 512, 512 - 2 * sizeof (void*));
+ test_memalign ( 1024, 1024 - 2 * sizeof (void*));
+ test_memalign ( 2048, 2048 - 2 * sizeof (void*));
+ test_memalign ( 4096, 4096 - 2 * sizeof (void*));
+ test_memalign ( 8192, 8192 - 2 * sizeof (void*));
+ test_memalign (16384, 16384 - 2 * sizeof (void*));
+ test_memalign (32768, 32768 - 2 * sizeof (void*));
+ exit (0); /* success */
+ }
+ ],
+ [glib_cv_compliant_posix_memalign=1], [], [:])
+ :
+ fi
+ ])
+if test "$glib_cv_compliant_posix_memalign" = "1"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS, 1, [define if posix_memalign() can allocate any size])
+else
+ AC_MSG_RESULT(no)
+fi
+
+
+dnl ****************************************
dnl *** strlcpy/strlcat ***
dnl ****************************************
# Check for strlcpy
#include <process.h>
#endif
+#if defined HAVE_POSIX_MEMALIGN && defined POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS
+# define HAVE_COMLIANT_POSIX_MEMALIGN 1
+#endif
+
+
/* the GSlice allocator is split up into 4 layers, roughly modelled after the slab
* allocator and magazine extensions as outlined in:
* + [Bonwick94] Jeff Bonwick, The slab allocator: An object-caching kernel
mem_assert ((sys_page_size & (sys_page_size - 1)) == 0);
slice_config_init (&allocator->config);
allocator->min_page_size = sys_page_size;
-#if HAVE_POSIX_MEMALIGN || HAVE_MEMALIGN
+#if HAVE_COMLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN
/* allow allocation of pages up to 8KB (with 8KB alignment).
* this is useful because many medium to large sized structures
* fit less than 8 times (see [4]) into 4KB pages.
#endif
/* from config.h:
- * define HAVE_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works, <stdlib.h>
- * define HAVE_MEMALIGN 1 // if free(memalign(3)) works, <malloc.h>
- * define HAVE_VALLOC 1 // if free(valloc(3)) works, <stdlib.h> or <malloc.h>
+ * define HAVE_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works, <stdlib.h>
+ * define HAVE_COMLIANT_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works for sizes != 2^n, <stdlib.h>
+ * define HAVE_MEMALIGN 1 // if free(memalign(3)) works, <malloc.h>
+ * define HAVE_VALLOC 1 // if free(valloc(3)) works, <stdlib.h> or <malloc.h>
* if none is provided, we implement malloc(3)-based alloc-only page alignment
*/
-#if !(HAVE_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC)
+#if !(HAVE_COMLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC)
static GTrashStack *compat_valloc_trash = NULL;
#endif
{
gpointer aligned_memory = NULL;
gint err = ENOMEM;
-#if HAVE_POSIX_MEMALIGN
+#if HAVE_COMLIANT_POSIX_MEMALIGN
err = posix_memalign (&aligned_memory, alignment, memsize);
#elif HAVE_MEMALIGN
errno = 0;
allocator_memfree (gsize memsize,
gpointer mem)
{
-#if HAVE_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC
+#if HAVE_COMLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC
free (mem);
#else
mem_assert (memsize <= sys_page_size);