Mercurial > urweb
diff src/c/urweb.c @ 2013:77cc9169d6e0
Change context-local memory allocation to return word-aligned addresses (based on patch by Evan Danaher)
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Sun, 18 May 2014 18:58:50 -0400 |
parents | 93ff76058825 |
children | 4a93f379c452 |
line wrap: on
line diff
--- a/src/c/urweb.c Sun May 04 12:33:44 2014 -0400 +++ b/src/c/urweb.c Sun May 18 18:58:50 2014 -0400 @@ -1256,17 +1256,34 @@ ctx->amInitializing = 0; } +static void align_heap(uw_context ctx) { + size_t posn = ctx->heap.front - ctx->heap.start; + + if (posn % 4 != 0) { + size_t bump = 4 - posn % 4; + uw_check_heap(ctx, bump); + ctx->heap.front += bump; + } +} + void *uw_malloc(uw_context ctx, size_t len) { + // On some architectures, it's important that all word-sized memory accesses + // be to word-aligned addresses, so we'll do a little bit of extra work here + // in anticipation of a possible word-aligned access to the address we'll + // return. + void *result; if (ctx->amInitializing) { - result = malloc(len); - - if (result) + int error = posix_memalign(&result, 4, len); + + if (!error) return result; else - uw_error(ctx, FATAL, "uw_malloc: malloc() returns 0"); + uw_error(ctx, FATAL, "uw_malloc: posix_memalign() returns %d", error); } else { + align_heap(ctx); + uw_check_heap(ctx, len); result = ctx->heap.front; @@ -1276,6 +1293,8 @@ } void uw_begin_region(uw_context ctx) { + align_heap(ctx); + regions *r = (regions *) ctx->heap.front; uw_check_heap(ctx, sizeof(regions));