1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/pkg/tlsf/contrib/include/tlsf-malloc.h

102 lines
2.8 KiB
C

/*
* Copyright (C) 2014-2018 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @defgroup pkg_tlsf_malloc TLSF-based malloc.
* @ingroup pkg
* @ingroup sys_memory_management
*
* @brief TLSF-based global memory allocator.
*
* This is a malloc/free implementation built on top of the TLSF allocator.
* It defines a global tlsf_control block and performs allocations on that
* block. This implementation replaces the system malloc
*
* Additionally, the calls to TLSF are wrapped in irq_disable()/irq_restore(),
* to make it thread-safe.
*
* If this module is used as the system memory allocator, then the global memory
* control block should be initialized as the first thing before the stdlib is
* used. Boards should use tlsf_add_global_pool() at startup to add all the memory
* regions they want to make available for dynamic allocation via malloc().
*
* @{
* @file
*
* @brief TLSF-based global memory allocator.
* @author René Kijewski
* @author Juan I Carrano
*
*/
#ifndef TLSF_MALLOC_H
#define TLSF_MALLOC_H
#include <stddef.h>
#include "tlsf.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Struct to hold the total sizes of free and used blocks
* Used for @ref tlsf_size_walker()
*/
typedef struct {
unsigned free; /**< total free size */
unsigned used; /**< total used size */
} tlsf_size_container_t;
/**
* Walk the memory pool to print all block sizes and to calculate
* the total amount of free and used block sizes.
*
* @note This function is passed to tlsf_walk_pool()
*
* @param ptr Pointer to the current block.
* @param size Size of the current block at @p ptr.
* @param used Shows whether the current block is used or free.
* @param user Custom data expected to be of type ``pointer to tlsf_size_container_t``
*/
void tlsf_size_walker(void* ptr, size_t size, int used, void* user);
/**
* Add an area of memory to the global allocator pool.
*
* The first time this function is called, it will automatically perform a
* tlsf_create() on the global tlsf_control block.
*
* @warning If this module is used, then this function MUST be called at least
* once, before any allocations take place.
*
* @param mem Pointer to memory area. Should be aligned to 4 bytes.
* @param bytes Size in bytes of the memory area.
*
* @return 0 on success, nonzero on failure.
*/
int tlsf_add_global_pool(void *mem, size_t bytes);
/**
* Get a pointer to the global tlsf_control block.
*
* Use for debugging purposes only.
*/
tlsf_t _tlsf_get_global_control(void);
#ifdef __cplusplus
}
#endif
#endif /* TLSF_MALLOC_H */
/**
* @}
*/