]> granicus.if.org Git - python/commitdiff
Force 8-alignment of memory blocks, as needed on
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 13 Apr 2006 19:16:13 +0000 (19:16 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 13 Apr 2006 19:16:13 +0000 (19:16 +0000)
64-bit machines that require pointers to be aligned (e.g. IA64)

Python/pyarena.c

index f27de8676dce175b6f21761795d2bec50bc055e5..c5491e954a8e37700d4e1e51ad360f253e32157d 100644 (file)
 */
 
 #define DEFAULT_BLOCK_SIZE 8192
+#define ALIGNMENT              8
+#define ALIGNMENT_SHIFT                3
+#define ALIGNMENT_MASK         (ALIGNMENT - 1)
+#define ROUNDUP(x)             (((x) + ALIGNMENT_MASK) & ~ALIGNMENT_MASK)
+
 typedef struct _block {
        /* Total number of bytes owned by this block available to pass out.
         * Read-only after initialization.  The first such byte starts at
@@ -82,7 +87,8 @@ block_new(size_t size)
        b->ab_size = size;
        b->ab_mem = (void *)(b + 1);
        b->ab_next = NULL;
-       b->ab_offset = 0;
+       b->ab_offset = ROUNDUP((Py_uintptr_t)(b->ab_mem)) - 
+         (Py_uintptr_t)(b->ab_mem);
        return b;
 }
 
@@ -100,6 +106,7 @@ block_alloc(block *b, size_t size)
 {
        void *p;
        assert(b);
+       size = ROUNDUP(size);
        if (b->ab_offset + size > b->ab_size) {
                /* If we need to allocate more memory than will fit in
                   the default block, allocate a one-off block that is