| /* |
| * 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_ */ |