Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

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