blob: 4a73171d615d780e4b5d6921d0284c63a1cf0045 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (c) 2018, Linaro Limited
*/
#ifndef __MEMPOOL_H
#define __MEMPOOL_H
#include <types_ext.h>
/*
* Memory pool for large temporary memory allocations that must not fail.
* With the first allocation from an unused (idle or free) pool the pool
* becomes reserved for that particular thread, until all allocations are
* freed again. In order to avoid dead-lock and ease code review it is good
* practise to free everything allocated by a certain function before
* returning.
*/
/*
* struct mempool_item - internal struct to keep track of an item
*/
struct mempool_item {
size_t size;
ssize_t prev_item_offset;
ssize_t next_item_offset;
};
struct mempool;
#define MEMPOOL_ALIGN __alignof__(long)
#if defined(__KERNEL__)
/*
* System wide memory pool for large temporary memory allocation.
*/
extern struct mempool *mempool_default;
#endif
/*
* mempool_alloc_pool() - Allocate a new memory pool
* @data: a block of memory to carve out items from, must
* have an alignment of MEMPOOL_ALIGN.
* @size: size fo the block of memory
* @release_mem: function to call when the pool has been emptied,
* ignored if NULL.
* returns a pointer to a valid pool on success or NULL on failure.
*/
struct mempool *mempool_alloc_pool(void *data, size_t size,
void (*release_mem)(void *ptr, size_t size));
/*
* mempool_alloc() - Allocate an item from a memory pool
* @pool: A memory pool created with mempool_alloc_pool()
* @size: Size in bytes of the item to allocate
* return a valid pointer on success or NULL on failure.
*/
void *mempool_alloc(struct mempool *pool, size_t size);
/*
* mempool_calloc() - Allocate and zero initialize an array of elements from a
* memory pool
* @pool: A memory pool created with mempool_alloc_pool()
* @nmemb: Number of elements in the array
* @size: Size in bytes of each element in the array
* return a valid pointer on success or NULL on failure.
*/
void *mempool_calloc(struct mempool *pool, size_t nmemb, size_t size);
/*
* mempool_free() - Frees a previously allocated item
* @pool: A memory pool create with mempool_alloc_pool()
* @ptr: A pointer to a previously allocated item
*/
void mempool_free(struct mempool *pool, void *ptr);
#endif /*__MEMPOOL_H*/