xref: /optee_os/lib/libutils/ext/include/mempool.h (revision a2eb5b55d169aaf0961ecc98b74ced53b20fe42c)
1*a2eb5b55SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
2*a2eb5b55SJens Wiklander /*
3*a2eb5b55SJens Wiklander  * Copyright (c) 2018, Linaro Limited
4*a2eb5b55SJens Wiklander  */
5*a2eb5b55SJens Wiklander 
6*a2eb5b55SJens Wiklander #ifndef __MEMPOOL_H
7*a2eb5b55SJens Wiklander #define __MEMPOOL_H
8*a2eb5b55SJens Wiklander 
9*a2eb5b55SJens Wiklander #include <types_ext.h>
10*a2eb5b55SJens Wiklander 
11*a2eb5b55SJens Wiklander /*
12*a2eb5b55SJens Wiklander  * struct mempool_item - internal struct to keep track of an item
13*a2eb5b55SJens Wiklander  */
14*a2eb5b55SJens Wiklander struct mempool_item {
15*a2eb5b55SJens Wiklander 	size_t size;
16*a2eb5b55SJens Wiklander 	ssize_t prev_item_offset;
17*a2eb5b55SJens Wiklander 	ssize_t next_item_offset;
18*a2eb5b55SJens Wiklander };
19*a2eb5b55SJens Wiklander 
20*a2eb5b55SJens Wiklander struct mempool;
21*a2eb5b55SJens Wiklander 
22*a2eb5b55SJens Wiklander /*
23*a2eb5b55SJens Wiklander  * mempool_alloc_pool() - Allocate a new memory pool
24*a2eb5b55SJens Wiklander  * @data:		a block of memory to carve out items from
25*a2eb5b55SJens Wiklander  * @size:		size fo the block of memory
26*a2eb5b55SJens Wiklander  * @release_mem:	function to call when the pool has been emptied,
27*a2eb5b55SJens Wiklander  *			ignored if NULL.
28*a2eb5b55SJens Wiklander  * returns a pointer to a valid pool on success or NULL on failure.
29*a2eb5b55SJens Wiklander  */
30*a2eb5b55SJens Wiklander struct mempool *mempool_alloc_pool(void *data, size_t size,
31*a2eb5b55SJens Wiklander 				   void (*release_mem)(void *ptr, size_t size));
32*a2eb5b55SJens Wiklander 
33*a2eb5b55SJens Wiklander /*
34*a2eb5b55SJens Wiklander  * mempool_alloc() - Allocate an item from a memory pool
35*a2eb5b55SJens Wiklander  * @pool:		A memory pool created with mempool_alloc_pool()
36*a2eb5b55SJens Wiklander  * @size:		Size in bytes of the item to allocate
37*a2eb5b55SJens Wiklander  * return a valid pointer on success or NULL on failure.
38*a2eb5b55SJens Wiklander  */
39*a2eb5b55SJens Wiklander void *mempool_alloc(struct mempool *pool, size_t size);
40*a2eb5b55SJens Wiklander 
41*a2eb5b55SJens Wiklander /*
42*a2eb5b55SJens Wiklander  * mempool_free() - Frees a previously allocated item
43*a2eb5b55SJens Wiklander  * @pool:		A memory pool create with mempool_alloc_pool()
44*a2eb5b55SJens Wiklander  * @ptr:		A pointer to a previously allocated item
45*a2eb5b55SJens Wiklander  */
46*a2eb5b55SJens Wiklander void mempool_free(struct mempool *pool, void *ptr);
47*a2eb5b55SJens Wiklander 
48*a2eb5b55SJens Wiklander #endif /*__MEMPOOL_H*/
49