/* * 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 15 word block * to reserve room for a "typical" set of bucket list heads and the heap * footer(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)) \ + 15 * sizeof(void *)); \ struct k_mem_pool name = { \ .heap = &poolheap_##name \ } #endif /* ZEPHYR_INCLUDE_MEMPOOL_HEAP_H_ */