Add functions for: - combining two memory pools - determining if a memory address is within the range managed by a memory pool These functions will be used by future commits. Signed-off-by: Jameson Miller <jamill@xxxxxxxxxxxxx> --- mem-pool.c | 40 ++++++++++++++++++++++++++++++++++++++++ mem-pool.h | 13 +++++++++++++ 2 files changed, 53 insertions(+) diff --git a/mem-pool.c b/mem-pool.c index 01595bcca5..cc7d3a7ab1 100644 --- a/mem-pool.c +++ b/mem-pool.c @@ -108,3 +108,43 @@ void *mem_pool_calloc(struct mem_pool *mem_pool, size_t count, size_t size) memset(r, 0, len); return r; } + +int mem_pool_contains(struct mem_pool *mem_pool, void *mem) +{ + struct mp_block *p; + + /* Check if memory is allocated in a block */ + for (p = mem_pool->mp_block; p; p = p->next_block) + if ((mem >= ((void *)p->space)) && + (mem < ((void *)p->end))) + return 1; + + return 0; +} + +void mem_pool_combine(struct mem_pool *dst, struct mem_pool *src) +{ + /* Append the blocks from src to dst */ + if (dst->mp_block && src->mp_block) { + /* + * src and dst have blocks, append + * blocks from src to dst. + */ + dst->mp_block_tail->next_block = src->mp_block; + dst->mp_block_tail = src->mp_block_tail; + } else if (src->mp_block) { + /* + * src has blocks, dst is empty + * use pointers from src to set up dst. + */ + dst->mp_block = src->mp_block; + dst->mp_block_tail = src->mp_block_tail; + } else { + // src is empty, nothing to do. + } + + dst->pool_alloc += src->pool_alloc; + src->pool_alloc = 0; + src->mp_block = NULL; + src->mp_block_tail = NULL; +} diff --git a/mem-pool.h b/mem-pool.h index 5d3e6a367a..5c892d3bdb 100644 --- a/mem-pool.h +++ b/mem-pool.h @@ -41,4 +41,17 @@ void *mem_pool_alloc(struct mem_pool *pool, size_t len); */ void *mem_pool_calloc(struct mem_pool *pool, size_t count, size_t size); +/* + * Move the memory associated with the 'src' pool to the 'dst' pool. The 'src' + * pool will be empty and not contain any memory. It still needs to be free'd + * with a call to `mem_pool_discard`. + */ +void mem_pool_combine(struct mem_pool *dst, struct mem_pool *src); + +/* + * Check if a memory pointed at by 'mem' is part of the range of + * memory managed by the specified mem_pool. + */ +int mem_pool_contains(struct mem_pool *mem_pool, void *mem); + #endif -- 2.14.3