From: Martin v. Löwis Date: Thu, 13 Apr 2006 19:16:13 +0000 (+0000) Subject: Force 8-alignment of memory blocks, as needed on X-Git-Tag: v2.5a2~255 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=da690411234dbd0438b7b1090750c547c92c5194;p=python Force 8-alignment of memory blocks, as needed on 64-bit machines that require pointers to be aligned (e.g. IA64) --- diff --git a/Python/pyarena.c b/Python/pyarena.c index f27de8676d..c5491e954a 100644 --- a/Python/pyarena.c +++ b/Python/pyarena.c @@ -12,6 +12,11 @@ */ #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