68 #if MEMP_OVERFLOW_CHECK
74 #if MEMP_OVERFLOW_CHECK
83 #ifndef MEMP_SANITY_REGION_BEFORE
84 #define MEMP_SANITY_REGION_BEFORE 16
86 #if MEMP_SANITY_REGION_BEFORE > 0
87 #define MEMP_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE)
89 #define MEMP_SANITY_REGION_BEFORE_ALIGNED 0
91 #ifndef MEMP_SANITY_REGION_AFTER
92 #define MEMP_SANITY_REGION_AFTER 16
94 #if MEMP_SANITY_REGION_AFTER > 0
95 #define MEMP_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER)
97 #define MEMP_SANITY_REGION_AFTER_ALIGNED 0
101 #define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED)
102 #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED)
111 #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))
121 #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))
126 #if !MEM_USE_POOLS && !MEMP_MEM_MALLOC
130 #define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEM_ALIGN_SIZE(size),
138 #define LWIP_MEMPOOL(name,num,size,desc) (num),
144 static const char *memp_desc[
MEMP_MAX] = {
145 #define LWIP_MEMPOOL(name,num,size,desc) (desc),
150 #if MEMP_SEPARATE_POOLS
157 #define LWIP_MEMPOOL(name,num,size,desc) u8_t memp_memory_ ## name ## _base \
158 [((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))];
162 static u8_t *
const memp_bases[] = {
163 #define LWIP_MEMPOOL(name,num,size,desc) memp_memory_ ## name ## _base,
171 #define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
177 #if MEMP_SANITY_CHECK
188 for (m = memp_tab[i]; m !=
NULL; m = m->
next) {
190 for (n = memp_tab[i]; n !=
NULL; n = n->
next) {
191 if (n == m && --c < 0) {
200 #if MEMP_OVERFLOW_CHECK
201 #if defined(LWIP_DEBUG) && MEMP_STATS
202 static const char * memp_overflow_names[] = {
203 #define LWIP_MEMPOOL(name,num,size,desc) "/"desc,
216 memp_overflow_check_element_overflow(
struct memp *p,
u16_t memp_type)
220 #if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
222 for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) {
224 char errstr[128] =
"detected memp overflow in pool ";
226 if(memp_type >= 10) {
227 digit[0] =
'0' + (memp_type/10);
228 strcat(errstr, digit);
230 digit[0] =
'0' + (memp_type%10);
231 strcat(errstr, digit);
232 #if defined(LWIP_DEBUG) && MEMP_STATS
233 strcat(errstr, memp_overflow_names[memp_type]);
249 memp_overflow_check_element_underflow(
struct memp *p,
u16_t memp_type)
253 #if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
254 m = (
u8_t*)p +
MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;
255 for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) {
257 char errstr[128] =
"detected memp underflow in pool ";
259 if(memp_type >= 10) {
260 digit[0] =
'0' + (memp_type/10);
261 strcat(errstr, digit);
263 digit[0] =
'0' + (memp_type%10);
264 strcat(errstr, digit);
265 #if defined(LWIP_DEBUG) && MEMP_STATS
266 strcat(errstr, memp_overflow_names[memp_type]);
280 memp_overflow_check_all(
void)
288 for (j = 0; j < memp_num[i]; ++j) {
289 memp_overflow_check_element_overflow(p, i);
290 p = (
struct memp*)((
u8_t*)p +
MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED);
296 for (j = 0; j < memp_num[i]; ++j) {
297 memp_overflow_check_element_underflow(p, i);
298 p = (
struct memp*)((
u8_t*)p +
MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED);
307 memp_overflow_init(
void)
316 for (j = 0; j < memp_num[i]; ++j) {
317 #if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
318 m = (
u8_t*)p +
MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;
319 memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED);
321 #if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
323 memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED);
325 p = (
struct memp*)((
u8_t*)p +
MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED);
349 #if !MEMP_SEPARATE_POOLS
355 #if MEMP_SEPARATE_POOLS
356 memp = (
struct memp*)memp_bases[i];
359 for (j = 0; j < memp_num[i]; ++j) {
360 memp->
next = memp_tab[i];
362 memp = (
struct memp *)(
void *)((
u8_t *)memp +
MEMP_SIZE + memp_sizes[i]
364 + MEMP_SANITY_REGION_AFTER_ALIGNED
369 #if MEMP_OVERFLOW_CHECK
370 memp_overflow_init();
372 memp_overflow_check_all();
388 #if !MEMP_OVERFLOW_CHECK
391 memp_malloc_fn(
memp_t type,
const char* file,
const int line)
397 LWIP_ERROR(
"memp_malloc: type < MEMP_MAX", (type < MEMP_MAX),
return NULL;);
400 #if MEMP_OVERFLOW_CHECK >= 2
401 memp_overflow_check_all();
404 memp = memp_tab[type];
407 memp_tab[type] = memp->
next;
408 #if MEMP_OVERFLOW_CHECK
448 #if MEMP_OVERFLOW_CHECK
449 #if MEMP_OVERFLOW_CHECK >= 2
450 memp_overflow_check_all();
452 memp_overflow_check_element_overflow(memp, type);
453 memp_overflow_check_element_underflow(memp, type);
459 memp->
next = memp_tab[type];
460 memp_tab[type] = memp;
462 #if MEMP_SANITY_CHECK