56 lines
1.6 KiB
C
56 lines
1.6 KiB
C
/*
|
|
* Copyright (c) 2020 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#ifndef ZEPHYR_INCLUDE_MEMPOOL_HEAP_H_
|
|
|
|
/* Compatibility implementation of a k_mem_pool backend in terms of a
|
|
* k_heap
|
|
*/
|
|
|
|
/* The "ID" of a k_heap-based mempool is just the tuple of the data
|
|
* block pointer and the heap that allocated it
|
|
*/
|
|
struct k_mem_block_id {
|
|
void *data;
|
|
struct k_heap *heap;
|
|
};
|
|
|
|
/* Note the data pointer gets unioned with the same value stored in
|
|
* the ID field to save space.
|
|
*/
|
|
struct k_mem_block {
|
|
union {
|
|
void *data;
|
|
struct k_mem_block_id id;
|
|
};
|
|
};
|
|
|
|
struct k_mem_pool {
|
|
struct k_heap *heap;
|
|
};
|
|
|
|
/* Sizing is a heuristic, as k_mem_pool made promises about layout
|
|
* that k_heap does not. We make space for the number of maximum
|
|
* objects defined, and include extra so there's enough metadata space
|
|
* available for the maximum number of minimum-sized objects to be
|
|
* stored: 8 bytes for each desired chunk header, and a 24 word block
|
|
* to reserve room for a "typical" set of bucket list heads (this size
|
|
* was picked more to conform with existing test expectations than any
|
|
* rigorous theory -- we have tests that rely on being able to
|
|
* allocate the blocks promised and ones that make assumptions about
|
|
* when memory will run out).
|
|
*/
|
|
#define Z_MEM_POOL_DEFINE(name, minsz, maxsz, nmax, align) \
|
|
K_HEAP_DEFINE(poolheap_##name, \
|
|
((maxsz) * (nmax)) \
|
|
+ 8 * ((maxsz) * (nmax) / (minsz)) \
|
|
+ 24 * sizeof(void *)); \
|
|
struct k_mem_pool name = { \
|
|
.heap = &poolheap_##name \
|
|
}
|
|
|
|
|
|
#endif /* ZEPHYR_INCLUDE_MEMPOOL_HEAP_H_ */
|