diff options
Diffstat (limited to 'lib/libutils/isoc')
-rw-r--r-- | lib/libutils/isoc/bget_malloc.c | 263 | ||||
-rw-r--r-- | lib/libutils/isoc/include/malloc.h | 11 |
2 files changed, 0 insertions, 274 deletions
diff --git a/lib/libutils/isoc/bget_malloc.c b/lib/libutils/isoc/bget_malloc.c index c614af45..17105dc8 100644 --- a/lib/libutils/isoc/bget_malloc.c +++ b/lib/libutils/isoc/bget_malloc.c @@ -414,220 +414,6 @@ out: return p; } -static void create_free_block(struct bfhead *bf, bufsize size, struct bhead *bn, - struct bpoolset *poolset) -{ - assert(BH((char *)bf + size) == bn); - assert(bn->bsize < 0); /* Next block should be allocated */ - /* Next block shouldn't already have free block in front */ - assert(bn->prevfree == 0); - - /* Create the free buf header */ - bf->bh.bsize = size; - bf->bh.prevfree = 0; - - /* Update next block to point to the new free buf header */ - bn->prevfree = size; - - /* Insert the free buffer on the free list */ - assert(poolset->freelist.ql.blink->ql.flink == &poolset->freelist); - assert(poolset->freelist.ql.flink->ql.blink == &poolset->freelist); - bf->ql.flink = &poolset->freelist; - bf->ql.blink = poolset->freelist.ql.blink; - poolset->freelist.ql.blink = bf; - bf->ql.blink->ql.flink = bf; -} - -static void brel_before(char *orig_buf, char *new_buf, struct bpoolset *poolset) -{ - struct bfhead *bf; - struct bhead *b; - bufsize size; - bufsize orig_size; - - assert(orig_buf < new_buf); - /* There has to be room for the freebuf header */ - size = (bufsize)(new_buf - orig_buf); - assert(size >= (SizeQ + sizeof(struct bhead))); - - /* Point to head of original buffer */ - bf = BFH(orig_buf - sizeof(struct bhead)); - orig_size = -bf->bh.bsize; /* negative since it's an allocated buffer */ - - /* Point to head of the becoming new allocated buffer */ - b = BH(new_buf - sizeof(struct bhead)); - - if (bf->bh.prevfree != 0) { - /* Previous buffer is free, consolidate with that buffer */ - struct bfhead *bfp; - - /* Update the previous free buffer */ - bfp = BFH((char *)bf - bf->bh.prevfree); - assert(bfp->bh.bsize == bf->bh.prevfree); - bfp->bh.bsize += size; - - /* Make a new allocated buffer header */ - b->prevfree = bfp->bh.bsize; - /* Make it negative since it's an allocated buffer */ - b->bsize = -(orig_size - size); - } else { - /* - * Previous buffer is allocated, create a new buffer and - * insert on the free list. - */ - - /* Make it negative since it's an allocated buffer */ - b->bsize = -(orig_size - size); - - create_free_block(bf, size, b, poolset); - } - -#ifdef BufStats - poolset->totalloc -= size; - assert(poolset->totalloc >= 0); -#endif -} - -static void brel_after(char *buf, bufsize size, struct bpoolset *poolset) -{ - struct bhead *b = BH(buf - sizeof(struct bhead)); - struct bhead *bn; - bufsize new_size = size; - bufsize free_size; - - /* Select the size in the same way as in bget() */ - if (new_size < SizeQ) - new_size = SizeQ; -#ifdef SizeQuant -#if SizeQuant > 1 - new_size = (new_size + (SizeQuant - 1)) & (~(SizeQuant - 1)); -#endif -#endif - new_size += sizeof(struct bhead); - assert(new_size <= -b->bsize); - - /* - * Check if there's enough space at the end of the buffer to be - * able to free anything. - */ - free_size = -b->bsize - new_size; - if (free_size < SizeQ + sizeof(struct bhead)) - return; - - bn = BH((char *)b - b->bsize); - /* - * Set the new size of the buffer; - */ - b->bsize = -new_size; - if (bn->bsize > 0) { - /* Next buffer is free, consolidate with that buffer */ - struct bfhead *bfn = BFH(bn); - struct bfhead *nbf = BFH((char *)b + new_size); - struct bhead *bnn = BH((char *)bn + bn->bsize); - - assert(bfn->bh.prevfree == 0); - assert(bnn->prevfree == bfn->bh.bsize); - - /* Construct the new free header */ - nbf->bh.prevfree = 0; - nbf->bh.bsize = bfn->bh.bsize + free_size; - - /* Update the buffer after this to point to this header */ - bnn->prevfree += free_size; - - /* - * Unlink the previous free buffer and link the new free - * buffer. - */ - assert(bfn->ql.blink->ql.flink == bfn); - assert(bfn->ql.flink->ql.blink == bfn); - - /* Assing blink and flink from old free buffer */ - nbf->ql.blink = bfn->ql.blink; - nbf->ql.flink = bfn->ql.flink; - - /* Replace the old free buffer with the new one */ - nbf->ql.blink->ql.flink = nbf; - nbf->ql.flink->ql.blink = nbf; - } else { - /* New buffer is allocated, create a new free buffer */ - create_free_block(BFH((char *)b + new_size), free_size, bn, poolset); - } - -#ifdef BufStats - poolset->totalloc -= free_size; - assert(poolset->totalloc >= 0); -#endif - -} - -static void *raw_memalign(size_t hdr_size, size_t ftr_size, size_t alignment, - size_t size, struct malloc_ctx *ctx) -{ - size_t s; - uintptr_t b; - - raw_malloc_validate_pools(ctx); - - if (!IS_POWER_OF_TWO(alignment)) - return NULL; - - /* - * Normal malloc with headers always returns something SizeQuant - * aligned. - */ - if (alignment <= SizeQuant) - return raw_malloc(hdr_size, ftr_size, size, ctx); - - s = hdr_size + ftr_size + alignment + size + - SizeQ + sizeof(struct bhead); - - /* Check wapping */ - if (s < alignment || s < size) - return NULL; - - b = (uintptr_t)bget(s, &ctx->poolset); - if (!b) - goto out; - - if ((b + hdr_size) & (alignment - 1)) { - /* - * Returned buffer is not aligned as requested if the - * hdr_size is added. Find an offset into the buffer - * that is far enough in to the buffer to be able to free - * what's in front. - */ - uintptr_t p; - - /* - * Find the point where the buffer including supplied - * header size should start. - */ - p = b + hdr_size + alignment; - p &= ~(alignment - 1); - p -= hdr_size; - if ((p - b) < (SizeQ + sizeof(struct bhead))) - p += alignment; - assert((p + hdr_size + ftr_size + size) <= (b + s)); - - /* Free the front part of the buffer */ - brel_before((void *)b, (void *)p, &ctx->poolset); - - /* Set the new start of the buffer */ - b = p; - } - - /* - * Since b is now aligned, release what we don't need at the end of - * the buffer. - */ - brel_after((void *)b, hdr_size + ftr_size + size, &ctx->poolset); -out: - raw_malloc_return_hook((void *)b, size, ctx); - - return (void *)b; -} - /* Most of the stuff in this function is copied from bgetr() in bget.c */ static __maybe_unused bufsize bget_buf_size(void *buf) { @@ -798,23 +584,6 @@ static void *gen_mdbg_realloc(struct malloc_ctx *ctx, const char *fname, #define realloc_unlocked(ctx, ptr, size) \ gen_mdbg_realloc_unlocked(ctx, __FILE__, __LINE__, (ptr), (size)) -static void *gen_mdbg_memalign(struct malloc_ctx *ctx, const char *fname, - int lineno, size_t alignment, size_t size) -{ - struct mdbg_hdr *hdr; - uint32_t exceptions = malloc_lock(ctx); - - hdr = raw_memalign(sizeof(struct mdbg_hdr), mdbg_get_ftr_size(size), - alignment, size, ctx); - if (hdr) { - mdbg_update_hdr(hdr, fname, lineno, size); - hdr++; - } - malloc_unlock(ctx, exceptions); - return hdr; -} - - static void *get_payload_start_size(void *raw_buf, size_t *size) { struct mdbg_hdr *hdr = raw_buf; @@ -866,12 +635,6 @@ void *mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size) return gen_mdbg_realloc(&malloc_ctx, fname, lineno, ptr, size); } -void *mdbg_memalign(const char *fname, int lineno, size_t alignment, - size_t size) -{ - return gen_mdbg_memalign(&malloc_ctx, fname, lineno, alignment, size); -} - void mdbg_check(int bufdump) { gen_mdbg_check(&malloc_ctx, bufdump); @@ -922,16 +685,6 @@ void *realloc(void *ptr, size_t size) return p; } -void *memalign(size_t alignment, size_t size) -{ - void *p; - uint32_t exceptions = malloc_lock(&malloc_ctx); - - p = raw_memalign(0, 0, alignment, size, &malloc_ctx); - malloc_unlock(&malloc_ctx, exceptions); - return p; -} - static void *get_payload_start_size(void *ptr, size_t *size) { *size = bget_buf_size(ptr); @@ -1094,16 +847,6 @@ void *nex_realloc(void *ptr, size_t size) return p; } -void *nex_memalign(size_t alignment, size_t size) -{ - void *p; - uint32_t exceptions = malloc_lock(&nex_malloc_ctx); - - p = raw_memalign(0, 0, alignment, size, &nex_malloc_ctx); - malloc_unlock(&nex_malloc_ctx, exceptions); - return p; -} - void nex_free(void *ptr) { uint32_t exceptions = malloc_lock(&nex_malloc_ctx); @@ -1129,12 +872,6 @@ void *nex_mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size) return gen_mdbg_realloc(&nex_malloc_ctx, fname, lineno, ptr, size); } -void *nex_mdbg_memalign(const char *fname, int lineno, size_t alignment, - size_t size) -{ - return gen_mdbg_memalign(&nex_malloc_ctx, fname, lineno, alignment, size); -} - void nex_mdbg_check(int bufdump) { gen_mdbg_check(&nex_malloc_ctx, bufdump); diff --git a/lib/libutils/isoc/include/malloc.h b/lib/libutils/isoc/include/malloc.h index 9a21c67a..992d2282 100644 --- a/lib/libutils/isoc/include/malloc.h +++ b/lib/libutils/isoc/include/malloc.h @@ -15,8 +15,6 @@ void free(void *ptr); void *mdbg_malloc(const char *fname, int lineno, size_t size); void *mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); void *mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); -void *mdbg_memalign(const char *fname, int lineno, size_t alignment, - size_t size); void mdbg_check(int bufdump); @@ -25,15 +23,12 @@ void mdbg_check(int bufdump); mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) #define realloc(ptr, size) \ mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) -#define memalign(alignment, size) \ - mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) #else void *malloc(size_t size); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); -void *memalign(size_t alignment, size_t size); #define mdbg_check(x) do { } while (0) @@ -91,8 +86,6 @@ void nex_free(void *ptr); void *nex_mdbg_malloc(const char *fname, int lineno, size_t size); void *nex_mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); void *nex_mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); -void *nex_mdbg_memalign(const char *fname, int lineno, size_t alignment, - size_t size); void nex_mdbg_check(int bufdump); @@ -101,15 +94,12 @@ void nex_mdbg_check(int bufdump); nex_mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) #define nex_realloc(ptr, size) \ nex_mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) -#define nex_memalign(alignment, size) \ - nex_mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) #else /* ENABLE_MDBG */ void *nex_malloc(size_t size); void *nex_calloc(size_t nmemb, size_t size); void *nex_realloc(void *ptr, size_t size); -void *nex_memalign(size_t alignment, size_t size); #define nex_mdbg_check(x) do { } while (0) @@ -134,7 +124,6 @@ void nex_malloc_reset_stats(void); #define nex_malloc(size) malloc(size) #define nex_calloc(nmemb, size) calloc(nmemb, size) #define nex_realloc(ptr, size) realloc(ptr, size) -#define nex_memalign(alignment, size) memalign(alignment, size) #endif /* CFG_VIRTUALIZATION */ |