xref: /nrf52832-nimble/rt-thread/components/lwp/lwp_memheap.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2018-06-10     Bernard      first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #ifndef __LWP_MEMHEAP_H__
12*10465441SEvalZero #define __LWP_MEMHEAP_H__
13*10465441SEvalZero 
14*10465441SEvalZero #include <stdint.h>
15*10465441SEvalZero #include <rtthread.h>
16*10465441SEvalZero 
17*10465441SEvalZero /**
18*10465441SEvalZero  * memory item on the heap
19*10465441SEvalZero  */
20*10465441SEvalZero struct rt_lwp_memheap_item
21*10465441SEvalZero {
22*10465441SEvalZero     rt_uint32_t                 magic;                  /**< magic number for memheap */
23*10465441SEvalZero     struct rt_lwp_memheap      *pool_ptr;               /**< point of pool */
24*10465441SEvalZero 
25*10465441SEvalZero     struct rt_lwp_memheap_item *next;                   /**< next memheap item */
26*10465441SEvalZero     struct rt_lwp_memheap_item *prev;                   /**< prev memheap item */
27*10465441SEvalZero 
28*10465441SEvalZero     struct rt_lwp_memheap_item *next_free;              /**< next free memheap item */
29*10465441SEvalZero     struct rt_lwp_memheap_item *prev_free;              /**< prev free memheap item */
30*10465441SEvalZero };
31*10465441SEvalZero 
32*10465441SEvalZero /**
33*10465441SEvalZero  * Base structure of memory heap object
34*10465441SEvalZero  */
35*10465441SEvalZero struct rt_lwp_memheap
36*10465441SEvalZero {
37*10465441SEvalZero     struct rt_object        parent;                     /**< inherit from rt_object */
38*10465441SEvalZero 
39*10465441SEvalZero     void                   *start_addr;                 /**< pool start address and size */
40*10465441SEvalZero 
41*10465441SEvalZero     rt_uint32_t             pool_size;                  /**< pool size */
42*10465441SEvalZero     rt_uint32_t             available_size;             /**< available size */
43*10465441SEvalZero     rt_uint32_t             max_used_size;              /**< maximum allocated size */
44*10465441SEvalZero 
45*10465441SEvalZero     struct rt_lwp_memheap_item *block_list;             /**< used block list */
46*10465441SEvalZero     struct rt_lwp_memheap_item *free_list;              /**< free block list */
47*10465441SEvalZero     struct rt_lwp_memheap_item  free_header;            /**< free block list header */
48*10465441SEvalZero 
49*10465441SEvalZero     struct rt_semaphore     lock;                       /**< semaphore lock */
50*10465441SEvalZero 
51*10465441SEvalZero     rt_list_t mlist;
52*10465441SEvalZero };
53*10465441SEvalZero 
54*10465441SEvalZero extern rt_err_t rt_lwp_memheap_init(struct rt_lwp_memheap *memheap, const char *name, void *start_addr, rt_uint32_t size);
55*10465441SEvalZero extern void *rt_lwp_memheap_alloc(struct rt_lwp_memheap *heap, rt_uint32_t size);
56*10465441SEvalZero extern void rt_lwp_memheap_free(void *ptr);
57*10465441SEvalZero extern void *rt_lwp_memheap_realloc(struct rt_lwp_memheap *heap, void *ptr, rt_size_t newsize);
58*10465441SEvalZero extern rt_bool_t rt_lwp_memheap_is_empty(struct rt_lwp_memheap *memheap);
59*10465441SEvalZero extern rt_bool_t rt_lwp_memheap_unavailable_size_get(void);
60*10465441SEvalZero 
61*10465441SEvalZero #endif
62