# New Ticket Created by  chromatic 
# Please include the string:  [perl #57700]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=57700 >


Based on a comment from Seneca in IRC earlier tonight, I'd like to get 
feedback from Mac OS X users on this patch.  You need to reconfigure and 
rebuild Parrot after applying.  32-bit users should see no change, and 64-bit 
users should see more passing tests.

-- c

=== config/gen/platform/darwin/memalign.c
==================================================================
--- config/gen/platform/darwin/memalign.c	(revision 30106)
+++ config/gen/platform/darwin/memalign.c	(local)
@@ -1,6 +1,6 @@
 /*
  * $Id$
- * Copyright (C) 2007, The Perl Foundation.
+ * Copyright (C) 2007-2008, The Perl Foundation.
  */
 
 /*
@@ -26,77 +26,78 @@
 
 /*
 
-=item C<static unsigned log2int(unsigned x)>
+=item C<static unsigned long log2int(unsigned long x)>
 
-RT#48260: Not yet documented!!!
+RT #48260: Not yet documented!!!
 
 =cut
 
 */
 
-static unsigned log2int(unsigned x) {
-    return (x<2) ? 0 : log2int(x>>1)+1;
+static unsigned long log2int(unsigned long x) {
+    return (x < 2) ? 0 : log2int(x >> 1) + 1;
 }
 
 /*
 
-=item C<static unsigned roundDownPowerOf2(unsigned x)>
+=item C<static unsigned long roundDownPowerOf2(unsigned long x)>
 
-RT#48260: Not yet documented!!!
+RT #48260: Not yet documented!!!
 
 =cut
 
 */
 
-static unsigned roundDownPowerOf2(unsigned x) {
+static unsigned long roundDownPowerOf2(unsigned long x) {
     return (1 << log2int(x));
 }
 
 /*
 
-=item C<static unsigned roundUpPowerOf2(unsigned x)>
+=item C<static unsigned long roundUpPowerOf2(unsigned long x)>
 
-RT#48260: Not yet documented!!!
+RT #48260: Not yet documented!!!
 
 =cut
 
 */
 
-static unsigned roundUpPowerOf2(unsigned x)
+static unsigned long roundUpPowerOf2(unsigned long x)
 {
-    static unsigned one = 1;
-    unsigned log2Int = log2int(x);
+    static unsigned long one     = 1;
+    unsigned long        log2Int = log2int(x);
 
     return ((one << log2Int) == x) ? x : (one << (log2Int + 1));
 }
 
 /*
 
-=item C<static unsigned roundUpToPageBoundary(unsigned x)>
+=item C<static unsigned long roundUpToPageBoundary(unsigned long x)>
 
-RT#48260: Not yet documented!!!
+RT #48260: Not yet documented!!!
 
 =cut
 
 */
 
-static unsigned roundUpToPageBoundary(unsigned x)
+static unsigned long roundUpToPageBoundary(unsigned long x)
 {
-    unsigned roundedDown = trunc_page(x);
+    unsigned long roundedDown = trunc_page(x);
 
     return (roundedDown == x) ? x : (roundedDown + vm_page_size);
 }
 
 typedef struct _memalign_marker_t {
-                    vm_address_t start;
-                    vm_size_t size; } memalign_marker_t;
+    vm_address_t start;
+    vm_size_t size;
+} memalign_marker_t;
 
 /*
 
 =item C<void *
 Parrot_memalign(size_t align, size_t size)>
 
-RT#48260: Not yet documented!!!
+RT #48260: Not yet documented!!!
 
 =cut
 
@@ -105,51 +106,40 @@
 void *
 Parrot_memalign(size_t align, size_t size)
 {
-    size_t effectiveAlign = align;
-    size_t padding = 0;
+    size_t effectiveAlign   = align;
+    size_t padding          = 0;
     size_t amountToAllocate = 0;
 
     if (effectiveAlign < sizeof (void *))
-    {
         effectiveAlign = roundUpPowerOf2(sizeof (void *));
-    }
     else
-    {
         effectiveAlign = roundUpPowerOf2(effectiveAlign);
-    }
 
     if (effectiveAlign < sizeof (memalign_marker_t))
-    {
         padding = sizeof (memalign_marker_t);
-    }
     else
-    {
         padding = effectiveAlign;
-    }
 
     amountToAllocate = roundUpToPageBoundary(size + padding);
 
     {
-        vm_address_t p = (vm_address_t)NULL;
+        vm_address_t  p      = (vm_address_t)NULL;
         kern_return_t status = vm_allocate(mach_task_self(), &p,
                                                 amountToAllocate, 1);
 
         if (status != KERN_SUCCESS)
-        {
             return NULL;
-        }
-        else
-        {
-            vm_size_t logEffectiveAlign = log2int(effectiveAlign);
+        else {
+            vm_size_t    logEffectiveAlign      = log2int(effectiveAlign);
             vm_address_t lowestAvaliableAddress =
                                 p + sizeof (memalign_marker_t);
-            vm_address_t roundedDownAddress =
+            vm_address_t roundedDownAddress     =
                             ((lowestAvaliableAddress >> logEffectiveAlign)
-                                                        << logEffectiveAlign);
-            vm_address_t returnAddress =
-                            (roundedDownAddress == lowestAvaliableAddress) ?
-                                lowestAvaliableAddress :
-                                    (roundedDownAddress + effectiveAlign);
+                                                     << logEffectiveAlign);
+            vm_address_t returnAddress          =
+                            (roundedDownAddress == lowestAvaliableAddress)
+                            ?  lowestAvaliableAddress
+                            : (roundedDownAddress + effectiveAlign);
             vm_address_t firstUnneededPage = 0;
 
             memalign_marker_t *marker =
@@ -157,33 +147,28 @@
 
             /* lowest address used, then round down to vm_page boundary */
             vm_address_t usedPageBase = trunc_page((vm_address_t)marker);
-            marker->start = usedPageBase;
-            marker->size = returnAddress + size - usedPageBase;
+            marker->start             = usedPageBase;
+            marker->size              = returnAddress + size - usedPageBase;
 
-            if (usedPageBase > p)
-            {
+            if (usedPageBase > p) {
                 status = vm_deallocate(mach_task_self(), p, usedPageBase - p);
 
                 if (status != KERN_SUCCESS)
-                {
-                    fprintf(stderr,
-                            "Parrot_memalign(%zx, %zx) failed to deallocate extra header space.\n",
-                            align, size);
-                }
+                    fprintf(stderr, "Parrot_memalign(%zx, %zx) failed "
+                                    "to deallocate extra header space.\n",
+                                    align, size);
             }
 
             firstUnneededPage = roundUpToPageBoundary(returnAddress + size);
 
-            if (firstUnneededPage < p + amountToAllocate)
-            {
+            if (firstUnneededPage < p + amountToAllocate) {
                 status = vm_deallocate(mach_task_self(), firstUnneededPage,
                                     p + amountToAllocate - firstUnneededPage);
 
-                if (status != KERN_SUCCESS)
-                {
-                    fprintf(stderr,
-                            "Parrot_memalign(%zx, %zx) failed to deallocate extra footer space.\n",
-                            align, size);
+                if (status != KERN_SUCCESS) {
+                    fprintf(stderr, "Parrot_memalign(%zx, %zx) failed "
+                                    "to deallocate extra footer space.\n",
+                                    align, size);
                 }
             }
 
@@ -197,7 +182,7 @@
 =item C<void
 Parrot_free_memalign(void *p)>
 
-RT#48260: Not yet documented!!!
+RT #48260: Not yet documented!!!
 
 =cut
 
@@ -207,14 +192,11 @@
 Parrot_free_memalign(void *p)
 {
     memalign_marker_t *marker = (memalign_marker_t *)p - 1;
-
-    kern_return_t status = vm_deallocate(mach_task_self(),
+    kern_return_t      status = vm_deallocate(mach_task_self(),
                                             marker->start, marker->size);
 
     if (status != KERN_SUCCESS)
-    {
         fprintf(stderr, "Parrot_free_memalign(%p) failed!\n", p);
-    }
 }
 
 /*

Reply via email to