xref: /minix3/minix/lib/liblwip/dist/src/include/lwip/memp.h (revision 5d5fbe79c1b60734f34c69330aec5496644e8651)
1*5d5fbe79SDavid van Moolenbroek /**
2*5d5fbe79SDavid van Moolenbroek  * @file
3*5d5fbe79SDavid van Moolenbroek  * Memory pool API
4*5d5fbe79SDavid van Moolenbroek  */
5*5d5fbe79SDavid van Moolenbroek 
6*5d5fbe79SDavid van Moolenbroek /*
7*5d5fbe79SDavid van Moolenbroek  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
8*5d5fbe79SDavid van Moolenbroek  * All rights reserved.
9*5d5fbe79SDavid van Moolenbroek  *
10*5d5fbe79SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without modification,
11*5d5fbe79SDavid van Moolenbroek  * are permitted provided that the following conditions are met:
12*5d5fbe79SDavid van Moolenbroek  *
13*5d5fbe79SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright notice,
14*5d5fbe79SDavid van Moolenbroek  *    this list of conditions and the following disclaimer.
15*5d5fbe79SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright notice,
16*5d5fbe79SDavid van Moolenbroek  *    this list of conditions and the following disclaimer in the documentation
17*5d5fbe79SDavid van Moolenbroek  *    and/or other materials provided with the distribution.
18*5d5fbe79SDavid van Moolenbroek  * 3. The name of the author may not be used to endorse or promote products
19*5d5fbe79SDavid van Moolenbroek  *    derived from this software without specific prior written permission.
20*5d5fbe79SDavid van Moolenbroek  *
21*5d5fbe79SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
22*5d5fbe79SDavid van Moolenbroek  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23*5d5fbe79SDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24*5d5fbe79SDavid van Moolenbroek  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5d5fbe79SDavid van Moolenbroek  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26*5d5fbe79SDavid van Moolenbroek  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27*5d5fbe79SDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28*5d5fbe79SDavid van Moolenbroek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29*5d5fbe79SDavid van Moolenbroek  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30*5d5fbe79SDavid van Moolenbroek  * OF SUCH DAMAGE.
31*5d5fbe79SDavid van Moolenbroek  *
32*5d5fbe79SDavid van Moolenbroek  * This file is part of the lwIP TCP/IP stack.
33*5d5fbe79SDavid van Moolenbroek  *
34*5d5fbe79SDavid van Moolenbroek  * Author: Adam Dunkels <adam@sics.se>
35*5d5fbe79SDavid van Moolenbroek  *
36*5d5fbe79SDavid van Moolenbroek  */
37*5d5fbe79SDavid van Moolenbroek 
38*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_HDR_MEMP_H
39*5d5fbe79SDavid van Moolenbroek #define LWIP_HDR_MEMP_H
40*5d5fbe79SDavid van Moolenbroek 
41*5d5fbe79SDavid van Moolenbroek #ifdef __cplusplus
42*5d5fbe79SDavid van Moolenbroek extern "C" {
43*5d5fbe79SDavid van Moolenbroek #endif
44*5d5fbe79SDavid van Moolenbroek 
45*5d5fbe79SDavid van Moolenbroek /* run once with empty definition to handle all custom includes in lwippools.h */
46*5d5fbe79SDavid van Moolenbroek #define LWIP_MEMPOOL(name,num,size,desc)
47*5d5fbe79SDavid van Moolenbroek #include "lwip/priv/memp_std.h"
48*5d5fbe79SDavid van Moolenbroek 
49*5d5fbe79SDavid van Moolenbroek /** Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */
50*5d5fbe79SDavid van Moolenbroek typedef enum {
51*5d5fbe79SDavid van Moolenbroek #define LWIP_MEMPOOL(name,num,size,desc)  MEMP_##name,
52*5d5fbe79SDavid van Moolenbroek #include "lwip/priv/memp_std.h"
53*5d5fbe79SDavid van Moolenbroek   MEMP_MAX
54*5d5fbe79SDavid van Moolenbroek } memp_t;
55*5d5fbe79SDavid van Moolenbroek 
56*5d5fbe79SDavid van Moolenbroek #include "lwip/priv/memp_priv.h"
57*5d5fbe79SDavid van Moolenbroek #include "lwip/stats.h"
58*5d5fbe79SDavid van Moolenbroek 
59*5d5fbe79SDavid van Moolenbroek extern const struct memp_desc* const memp_pools[MEMP_MAX];
60*5d5fbe79SDavid van Moolenbroek 
61*5d5fbe79SDavid van Moolenbroek /**
62*5d5fbe79SDavid van Moolenbroek  * @ingroup mempool
63*5d5fbe79SDavid van Moolenbroek  * Declare prototype for private memory pool if it is used in multiple files
64*5d5fbe79SDavid van Moolenbroek  */
65*5d5fbe79SDavid van Moolenbroek #define LWIP_MEMPOOL_PROTOTYPE(name) extern const struct memp_desc memp_ ## name
66*5d5fbe79SDavid van Moolenbroek 
67*5d5fbe79SDavid van Moolenbroek #if MEMP_MEM_MALLOC
68*5d5fbe79SDavid van Moolenbroek 
69*5d5fbe79SDavid van Moolenbroek #define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \
70*5d5fbe79SDavid van Moolenbroek   LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats_ ## name) \
71*5d5fbe79SDavid van Moolenbroek   const struct memp_desc memp_ ## name = { \
72*5d5fbe79SDavid van Moolenbroek     DECLARE_LWIP_MEMPOOL_DESC(desc) \
73*5d5fbe79SDavid van Moolenbroek     LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name) \
74*5d5fbe79SDavid van Moolenbroek     LWIP_MEM_ALIGN_SIZE(size) \
75*5d5fbe79SDavid van Moolenbroek   };
76*5d5fbe79SDavid van Moolenbroek 
77*5d5fbe79SDavid van Moolenbroek #else /* MEMP_MEM_MALLOC */
78*5d5fbe79SDavid van Moolenbroek 
79*5d5fbe79SDavid van Moolenbroek /**
80*5d5fbe79SDavid van Moolenbroek  * @ingroup mempool
81*5d5fbe79SDavid van Moolenbroek  * Declare a private memory pool
82*5d5fbe79SDavid van Moolenbroek  * Private mempools example:
83*5d5fbe79SDavid van Moolenbroek  * .h: only when pool is used in multiple .c files: LWIP_MEMPOOL_PROTOTYPE(my_private_pool);
84*5d5fbe79SDavid van Moolenbroek  * .c:
85*5d5fbe79SDavid van Moolenbroek  *   - in global variables section: LWIP_MEMPOOL_DECLARE(my_private_pool, 10, sizeof(foo), "Some description")
86*5d5fbe79SDavid van Moolenbroek  *   - call ONCE before using pool (e.g. in some init() function): LWIP_MEMPOOL_INIT(my_private_pool);
87*5d5fbe79SDavid van Moolenbroek  *   - allocate: void* my_new_mem = LWIP_MEMPOOL_ALLOC(my_private_pool);
88*5d5fbe79SDavid van Moolenbroek  *   - free: LWIP_MEMPOOL_FREE(my_private_pool, my_new_mem);
89*5d5fbe79SDavid van Moolenbroek  *
90*5d5fbe79SDavid van Moolenbroek  * To relocate a pool, declare it as extern in cc.h. Example for GCC:
91*5d5fbe79SDavid van Moolenbroek  *   extern u8_t __attribute__((section(".onchip_mem"))) memp_memory_my_private_pool[];
92*5d5fbe79SDavid van Moolenbroek  */
93*5d5fbe79SDavid van Moolenbroek #define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \
94*5d5fbe79SDavid van Moolenbroek   LWIP_DECLARE_MEMORY_ALIGNED(memp_memory_ ## name ## _base, ((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))); \
95*5d5fbe79SDavid van Moolenbroek     \
96*5d5fbe79SDavid van Moolenbroek   LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats_ ## name) \
97*5d5fbe79SDavid van Moolenbroek     \
98*5d5fbe79SDavid van Moolenbroek   static struct memp *memp_tab_ ## name; \
99*5d5fbe79SDavid van Moolenbroek     \
100*5d5fbe79SDavid van Moolenbroek   const struct memp_desc memp_ ## name = { \
101*5d5fbe79SDavid van Moolenbroek     DECLARE_LWIP_MEMPOOL_DESC(desc) \
102*5d5fbe79SDavid van Moolenbroek     LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name) \
103*5d5fbe79SDavid van Moolenbroek     LWIP_MEM_ALIGN_SIZE(size), \
104*5d5fbe79SDavid van Moolenbroek     (num), \
105*5d5fbe79SDavid van Moolenbroek     memp_memory_ ## name ## _base, \
106*5d5fbe79SDavid van Moolenbroek     &memp_tab_ ## name \
107*5d5fbe79SDavid van Moolenbroek   };
108*5d5fbe79SDavid van Moolenbroek 
109*5d5fbe79SDavid van Moolenbroek #endif /* MEMP_MEM_MALLOC */
110*5d5fbe79SDavid van Moolenbroek 
111*5d5fbe79SDavid van Moolenbroek /**
112*5d5fbe79SDavid van Moolenbroek  * @ingroup mempool
113*5d5fbe79SDavid van Moolenbroek  * Initialize a private memory pool
114*5d5fbe79SDavid van Moolenbroek  */
115*5d5fbe79SDavid van Moolenbroek #define LWIP_MEMPOOL_INIT(name)    memp_init_pool(&memp_ ## name)
116*5d5fbe79SDavid van Moolenbroek /**
117*5d5fbe79SDavid van Moolenbroek  * @ingroup mempool
118*5d5fbe79SDavid van Moolenbroek  * Allocate from a private memory pool
119*5d5fbe79SDavid van Moolenbroek  */
120*5d5fbe79SDavid van Moolenbroek #define LWIP_MEMPOOL_ALLOC(name)   memp_malloc_pool(&memp_ ## name)
121*5d5fbe79SDavid van Moolenbroek /**
122*5d5fbe79SDavid van Moolenbroek  * @ingroup mempool
123*5d5fbe79SDavid van Moolenbroek  * Free element from a private memory pool
124*5d5fbe79SDavid van Moolenbroek  */
125*5d5fbe79SDavid van Moolenbroek #define LWIP_MEMPOOL_FREE(name, x) memp_free_pool(&memp_ ## name, (x))
126*5d5fbe79SDavid van Moolenbroek 
127*5d5fbe79SDavid van Moolenbroek #if MEM_USE_POOLS
128*5d5fbe79SDavid van Moolenbroek /** This structure is used to save the pool one element came from.
129*5d5fbe79SDavid van Moolenbroek  * This has to be defined here as it is required for pool size calculation. */
130*5d5fbe79SDavid van Moolenbroek struct memp_malloc_helper
131*5d5fbe79SDavid van Moolenbroek {
132*5d5fbe79SDavid van Moolenbroek    memp_t poolnr;
133*5d5fbe79SDavid van Moolenbroek #if MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS)
134*5d5fbe79SDavid van Moolenbroek    u16_t size;
135*5d5fbe79SDavid van Moolenbroek #endif /* MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS) */
136*5d5fbe79SDavid van Moolenbroek };
137*5d5fbe79SDavid van Moolenbroek #endif /* MEM_USE_POOLS */
138*5d5fbe79SDavid van Moolenbroek 
139*5d5fbe79SDavid van Moolenbroek void  memp_init(void);
140*5d5fbe79SDavid van Moolenbroek 
141*5d5fbe79SDavid van Moolenbroek #if MEMP_OVERFLOW_CHECK
142*5d5fbe79SDavid van Moolenbroek void *memp_malloc_fn(memp_t type, const char* file, const int line);
143*5d5fbe79SDavid van Moolenbroek #define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__)
144*5d5fbe79SDavid van Moolenbroek #else
145*5d5fbe79SDavid van Moolenbroek void *memp_malloc(memp_t type);
146*5d5fbe79SDavid van Moolenbroek #endif
147*5d5fbe79SDavid van Moolenbroek void  memp_free(memp_t type, void *mem);
148*5d5fbe79SDavid van Moolenbroek 
149*5d5fbe79SDavid van Moolenbroek #ifdef __cplusplus
150*5d5fbe79SDavid van Moolenbroek }
151*5d5fbe79SDavid van Moolenbroek #endif
152*5d5fbe79SDavid van Moolenbroek 
153*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_HDR_MEMP_H */
154