From 68e76ae63605193e89b05eab90dc6fdfa6f37053 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Thu, 7 Jan 2016 13:21:53 +0100 Subject: Add pool allocator. --- include/mupdf/fitz.h | 3 ++- include/mupdf/fitz/pool.h | 26 ++++++++++++++++++++++++++ source/fitz/pool.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 include/mupdf/fitz/pool.h create mode 100644 source/fitz/pool.c diff --git a/include/mupdf/fitz.h b/include/mupdf/fitz.h index 11accf6d..cf78060c 100644 --- a/include/mupdf/fitz.h +++ b/include/mupdf/fitz.h @@ -9,9 +9,10 @@ #include "mupdf/fitz/getopt.h" #include "mupdf/fitz/hash.h" #include "mupdf/fitz/math.h" +#include "mupdf/fitz/pool.h" #include "mupdf/fitz/string.h" -#include "mupdf/fitz/ucdn.h" #include "mupdf/fitz/tree.h" +#include "mupdf/fitz/ucdn.h" #include "mupdf/fitz/xml.h" /* I/O */ diff --git a/include/mupdf/fitz/pool.h b/include/mupdf/fitz/pool.h new file mode 100644 index 00000000..924fb804 --- /dev/null +++ b/include/mupdf/fitz/pool.h @@ -0,0 +1,26 @@ +#ifndef MUPDF_FITZ_POOL_H +#define MUPDF_FITZ_POOL_H + +#include "mupdf/fitz/system.h" +#include "mupdf/fitz/context.h" + +typedef struct fz_pool_s fz_pool; +typedef struct fz_pool_node_s fz_pool_node; + +struct fz_pool_s +{ + fz_pool_node *head, *tail; + char *pos, *end; +}; + +struct fz_pool_node_s +{ + fz_pool_node *next; + char mem[64 << 10]; /* 64k blocks */ +}; + +fz_pool *fz_new_pool(fz_context *ctx); +void *fz_pool_alloc(fz_context *ctx, fz_pool *pool, size_t size); +void fz_drop_pool(fz_context *ctx, fz_pool *pool); + +#endif diff --git a/source/fitz/pool.c b/source/fitz/pool.c new file mode 100644 index 00000000..e676947f --- /dev/null +++ b/source/fitz/pool.c @@ -0,0 +1,44 @@ +#include "mupdf/fitz.h" + +fz_pool *fz_new_pool(fz_context *ctx) +{ + fz_pool *pool = fz_malloc_struct(ctx, fz_pool); + fz_pool_node *node = fz_malloc_struct(ctx, fz_pool_node); + pool->head = pool->tail = node; + pool->pos = node->mem; + pool->end = node->mem + sizeof node->mem; + return pool; +} + +void *fz_pool_alloc(fz_context *ctx, fz_pool *pool, size_t size) +{ + char *ptr; + + /* round size to pointer alignment (we don't expect to use doubles) */ + size = ((size + sizeof(void*) - 1) / sizeof(void*)) * sizeof(void*); + + if (pool->pos + size > pool->end) + { + fz_pool_node *node = fz_malloc_struct(ctx, fz_pool_node); + pool->tail = pool->tail->next = node; + pool->pos = node->mem; + pool->end = node->mem + sizeof node->mem; + if (pool->pos + size > pool->end) + fz_throw(ctx, FZ_ERROR_GENERIC, "out of memory: allocation too large to fit in pool"); + } + ptr = pool->pos; + pool->pos += size; + return ptr; +} + +void fz_drop_pool(fz_context *ctx, fz_pool *pool) +{ + fz_pool_node *node = pool->head; + while (node) + { + fz_pool_node *next = node->next; + fz_free(ctx, node); + node = next; + } + fz_free(ctx, pool); +} -- cgit v1.2.3