scripts

misc scripts and tools
git clone git://git.2f30.org/scripts.git
Log | Files | Refs

commit faf44fd5917251a56e5264e238417d06d5dd288f
parent 64c09e5c2a77312abc0c4e18cdc3751e93748089
Author: sin <sin@2f30.org>
Date:   Fri Aug  2 11:27:09 +0100

Switch to sbrk() instead of mmap()

Allow for allocating memory at a particularly aligned address.

Diffstat:
random/rballoc.c | 41++++++++++++++++++++++-------------------
1 file changed, 22 insertions(+), 19 deletions(-)
diff --git a/random/rballoc.c b/random/rballoc.c @@ -5,6 +5,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <stdint.h> #include <errno.h> #include "tree.h" #include "spinlock.h" @@ -90,23 +91,24 @@ alloc_object(size_t siz) return sd.base; } -/* Allocate a memory block. Round `siz' to be - * a multiple of PAGESIZE */ static void * -alloc_block(size_t siz) +sbrk_aligned(size_t align, size_t siz) { - void *addr; + char *p; - siz = PAGESIZE * ((siz + PAGESIZE - 1) / PAGESIZE); - addr = mmap(0, siz, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, -1, 0); - if (addr == MAP_FAILED) + if ((align - 1) & align) return NULL; - return addr; + sd.base = sbrk(siz + align); + if (sd.base == (void *)-1) + return NULL; + sd.siz += siz + align; + p = sd.base; + p = (char *)(((uintptr_t)p + align) & ~(align - 1)); + return p; } -void * -malloc(size_t siz) +static void * +aligned_malloc(size_t align, size_t siz) { struct node n, *an, *res; void *p; @@ -126,7 +128,7 @@ malloc(size_t siz) unlock(&rblock); return NULL; } - p = alloc_block(siz); + p = sbrk_aligned(align, siz); if (!p) { unlock(&rblock); return NULL; @@ -144,6 +146,12 @@ malloc(size_t siz) } void * +malloc(size_t siz) +{ + return aligned_malloc(PAGESIZE, siz); +} + +void * realloc(void *oldp, size_t siz) { struct node n, *res; @@ -180,7 +188,7 @@ realloc(void *oldp, size_t siz) unlock(&rblock); return NULL; } - newan->buf = alloc_block(siz); + newan->buf = sbrk_aligned(PAGESIZE, siz); if (!newan->buf) { free_object(newan, sizeof(*newan)); unlock(&rblock); @@ -249,12 +257,7 @@ posix_memalign(void **memptr, size_t align, size_t siz) return EINVAL; if (align < sizeof(void *)) return EINVAL; - if (PAGESIZE % align) { - fprintf(stderr, "%s: %zu alignment not supported!\n", - __func__, align); - abort(); - } - mem = malloc(siz); + mem = aligned_malloc(align, siz); if (!mem) return ENOMEM; *memptr = mem;