Index: config/auto/memalign.pl
===================================================================
RCS file: /cvs/public/parrot/config/auto/memalign.pl,v
retrieving revision 1.9
diff -u -b -r1.9 memalign.pl
--- config/auto/memalign.pl	13 Mar 2004 16:38:59 -0000	1.9
+++ config/auto/memalign.pl	13 Oct 2004 07:22:49 -0000
@@ -30,6 +30,9 @@
 	return;
     }
 
+    if (defined Configure::Data->get('memalign')) {
+		return; # already set; leave it alone
+	}
     my $test = 0;
 
     if (Configure::Data->get('i_malloc')) {
Index: config/gen/config_h/feature_h.in
===================================================================
RCS file: /cvs/public/parrot/config/gen/config_h/feature_h.in,v
retrieving revision 1.2
diff -u -b -r1.2 feature_h.in
--- config/gen/config_h/feature_h.in	19 Mar 2004 04:08:10 -0000	1.2
+++ config/gen/config_h/feature_h.in	13 Oct 2004 07:22:49 -0000
@@ -31,6 +31,12 @@
 
 END
 }
+elsif (${memalign} eq 'some_memalign') {
+  print OUT <<'END'
+#define PARROT_HAS_SOME_MEMALIGN
+
+END
+}
 
 	print OUT <<EOP;
 /* from config/auto/isreg */
Index: config/gen/platform/platform_interface.h
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/platform_interface.h,v
retrieving revision 1.21
diff -u -b -r1.21 platform_interface.h
--- config/gen/platform/platform_interface.h	5 Aug 2004 17:30:50 -0000	1.21
+++ config/gen/platform/platform_interface.h	13 Oct 2004 07:22:49 -0000
@@ -26,8 +26,10 @@
 void *Parrot_memalign_if_possible(size_t align, size_t size);
 void Parrot_free_memalign(void *);
 
-#if !defined(PARROT_HAS_MEMALIGN) && !defined(PARROT_HAS_POSIX_MEMALIGN)
-#  define Parrot_memalign_if_possible(a, s) malloc(a)
+#if !defined(PARROT_HAS_SOME_MEMALIGN)
+#  define Parrot_memalign_if_possible(a, s) malloc(s)
+#else
+#  define Parrot_memalign_if_possible(a, s) Parrot_memalign(a, s)
 #endif
 
 #ifdef PARROT_HAS_EXEC_PROTECT
Index: config/gen/platform/generic/memalign.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/generic/memalign.c,v
retrieving revision 1.1
diff -u -b -r1.1 memalign.c
--- config/gen/platform/generic/memalign.c	19 Feb 2004 17:06:12 -0000	1.1
+++ config/gen/platform/generic/memalign.c	13 Oct 2004 07:22:49 -0000
@@ -13,14 +13,6 @@
     return i == 0 ? p : NULL;
 }
 
-void *
-Parrot_memalign_if_possible(size_t align, size_t size)
-{
-    void *p;
-    int i = posix_memalign(&p, align, size);
-    return i == 0 ? p : NULL;
-}
-
 #elif defined(PARROT_HAS_MEMALIGN)
 
 #if defined(PARROT_HAS_HEADER_MALLOC)
@@ -35,12 +27,6 @@
     return memalign(align, size);
 }
 
-void *
-Parrot_memalign_if_possible(size_t align, size_t size)
-{
-    return memalign(align, size);
-}
-
 #endif
 
 void
Index: config/init/hints/darwin.pl
===================================================================
RCS file: /cvs/public/parrot/config/init/hints/darwin.pl,v
retrieving revision 1.14
diff -u -b -r1.14 darwin.pl
--- config/init/hints/darwin.pl	12 Oct 2004 09:00:23 -0000	1.14
+++ config/init/hints/darwin.pl	13 Oct 2004 07:22:49 -0000
@@ -25,4 +25,5 @@
   ld => 'c++',
   ld_share_flags => '-dynamiclib',
   ld_load_flags => '-bundle -undefined suppress',
+  memalign => 'some_memalign',
 );
Index: src/headers.c
===================================================================
RCS file: /cvs/public/parrot/src/headers.c,v
retrieving revision 1.59
diff -u -b -r1.59 headers.c
--- src/headers.c	8 Sep 2004 00:33:58 -0000	1.59
+++ src/headers.c	13 Oct 2004 07:22:52 -0000
@@ -714,10 +714,11 @@
                     next = cur_arena->prev;
 #if ARENA_DOD_FLAGS
                     mem_internal_free(cur_arena->dod_flags);
+                    Parrot_free_memalign(cur_arena);
 #else
                     mem_internal_free(cur_arena->start_objects);
-#endif
                     mem_internal_free(cur_arena);
+#endif
                     cur_arena = next;
                 }
                 mem_internal_free(pool);
@@ -730,10 +731,11 @@
         next = cur_arena->prev;
 #if ARENA_DOD_FLAGS
         mem_internal_free(cur_arena->dod_flags);
+        Parrot_free_memalign(cur_arena);
 #else
         mem_internal_free(cur_arena->start_objects);
-#endif
         mem_internal_free(cur_arena);
+#endif
         cur_arena = next;
     }
     mem_internal_free(interpreter->arena_base->pmc_ext_pool);
Index: src/interpreter.c
===================================================================
RCS file: /cvs/public/parrot/src/interpreter.c,v
retrieving revision 1.316
diff -u -b -r1.316 interpreter.c
--- src/interpreter.c	13 Aug 2004 09:15:48 -0000	1.316
+++ src/interpreter.c	13 Oct 2004 07:22:52 -0000
@@ -360,8 +360,10 @@
         size_t N = interpreter->code->cur_cs->base.size;
         size_t i;
         void *pred_func;
-/* Parrot_memalign_if_possible in OpenBSD allocates 256 if you ask for 312 */
-#if 1
+/* Parrot_memalign_if_possible in OpenBSD allocates 256 if you ask for 312
+   -- Need to verify this, it may have been a bug elsewhere. If it works now,
+   we can remove the mem_sys_allocate_zeroed line below. */
+#if 0
         void **temp = (void **)mem_sys_allocate_zeroed(N * sizeof(void *));
 #else
         void **temp = (void **)Parrot_memalign_if_possible(256,
