78#define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEMPOOL_DECLARE(name,num,size,desc)
81const struct memp_desc *
const memp_pools[MEMP_MAX] = {
82#define LWIP_MEMPOOL(name,num,size,desc) &memp_ ## name,
86#ifdef LWIP_HOOK_FILENAME
87#include LWIP_HOOK_FILENAME
90#if MEMP_MEM_MALLOC && MEMP_OVERFLOW_CHECK >= 2
91#undef MEMP_OVERFLOW_CHECK
93#define MEMP_OVERFLOW_CHECK 1
96#if MEMP_SANITY_CHECK && !MEMP_MEM_MALLOC
107 for (h = t->next; (t != NULL) && (h != NULL); t = t->next,
108 h = ((h->next != NULL) ? h->next->next : NULL)) {
119#if MEMP_OVERFLOW_CHECK
128memp_overflow_check_element(
struct memp *p,
const struct memp_desc *desc)
130 mem_overflow_check_raw((u8_t *)p + MEMP_SIZE, desc->size,
"pool ", desc->desc);
137memp_overflow_init_element(
struct memp *p,
const struct memp_desc *desc)
139 mem_overflow_init_raw((u8_t *)p + MEMP_SIZE, desc->size);
142#if MEMP_OVERFLOW_CHECK >= 2
149memp_overflow_check_all(
void)
154 SYS_ARCH_PROTECT(old_level);
156 for (i = 0; i < MEMP_MAX; ++i) {
158 for (j = 0; j < memp_pools[i]->num; ++j) {
159 memp_overflow_check_element(p, memp_pools[i]);
160 p =
LWIP_ALIGNMENT_CAST(
struct memp *, ((u8_t *)p + MEMP_SIZE + memp_pools[i]->size + MEM_SANITY_REGION_AFTER_ALIGNED));
163 SYS_ARCH_UNPROTECT(old_level);
187 memset(
memp, 0, (
size_t)desc->num * (MEMP_SIZE + desc->size
189 + MEM_SANITY_REGION_AFTER_ALIGNED
194 for (i = 0; i < desc->num; ++i) {
195 memp->next = *desc->tab;
197#if MEMP_OVERFLOW_CHECK
198 memp_overflow_init_element(
memp, desc);
201 memp = (
struct memp *)(
void *)((u8_t *)
memp + MEMP_SIZE + desc->size
203 + MEM_SANITY_REGION_AFTER_ALIGNED
208 desc->stats->avail = desc->num;
212#if MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY)
213 desc->stats->name = desc->desc;
229 for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) {
232#if LWIP_STATS && MEMP_STATS
233 lwip_stats.memp[i] = memp_pools[i]->stats;
237#if MEMP_OVERFLOW_CHECK >= 2
239 memp_overflow_check_all();
244#if !MEMP_OVERFLOW_CHECK
245do_memp_malloc_pool(
const struct memp_desc *desc)
247do_memp_malloc_pool_fn(
const struct memp_desc *desc,
const char *file,
const int line)
255 SYS_ARCH_PROTECT(old_level);
257 SYS_ARCH_PROTECT(old_level);
264#if MEMP_OVERFLOW_CHECK == 1
265 memp_overflow_check_element(
memp, desc);
268 *desc->tab =
memp->next;
269#if MEMP_OVERFLOW_CHECK
273#if MEMP_OVERFLOW_CHECK
277 memp_overflow_init_element(
memp, desc);
280 LWIP_ASSERT(
"memp_malloc: memp properly aligned",
281 ((mem_ptr_t)
memp % MEM_ALIGNMENT) == 0);
284 if (desc->stats->used > desc->stats->max) {
285 desc->stats->max = desc->stats->used;
288 SYS_ARCH_UNPROTECT(old_level);
290 return ((u8_t *)
memp + MEMP_SIZE);
295 SYS_ARCH_UNPROTECT(old_level);
310#if !MEMP_OVERFLOW_CHECK
313memp_malloc_pool_fn(
const struct memp_desc *desc,
const char *file,
const int line)
316 LWIP_ASSERT(
"invalid pool desc", desc != NULL);
321#if !MEMP_OVERFLOW_CHECK
322 return do_memp_malloc_pool(desc);
324 return do_memp_malloc_pool_fn(desc, file, line);
336#if !MEMP_OVERFLOW_CHECK
339memp_malloc_fn(
memp_t type,
const char *file,
const int line)
343 LWIP_ERROR(
"memp_malloc: type < MEMP_MAX", (type < MEMP_MAX),
return NULL;);
345#if MEMP_OVERFLOW_CHECK >= 2
346 memp_overflow_check_all();
349#if !MEMP_OVERFLOW_CHECK
350 memp = do_memp_malloc_pool(memp_pools[type]);
352 memp = do_memp_malloc_pool_fn(memp_pools[type], file, line);
359do_memp_free_pool(
const struct memp_desc *desc,
void *
mem)
364 LWIP_ASSERT(
"memp_free: mem properly aligned",
365 ((mem_ptr_t)
mem % MEM_ALIGNMENT) == 0);
368 memp = (
struct memp *)(
void *)((u8_t *)
mem - MEMP_SIZE);
370 SYS_ARCH_PROTECT(old_level);
372#if MEMP_OVERFLOW_CHECK == 1
373 memp_overflow_check_element(
memp, desc);
382 SYS_ARCH_UNPROTECT(old_level);
385 memp->next = *desc->tab;
389 LWIP_ASSERT(
"memp sanity", memp_sanity(desc));
392 SYS_ARCH_UNPROTECT(old_level);
405 LWIP_ASSERT(
"invalid pool desc", desc != NULL);
406 if ((desc == NULL) || (
mem == NULL)) {
410 do_memp_free_pool(desc,
mem);
422#ifdef LWIP_HOOK_MEMP_AVAILABLE
423 struct memp *old_first;
426 LWIP_ERROR(
"memp_free: type < MEMP_MAX", (type < MEMP_MAX),
return;);
432#if MEMP_OVERFLOW_CHECK >= 2
433 memp_overflow_check_all();
436#ifdef LWIP_HOOK_MEMP_AVAILABLE
437 old_first = *memp_pools[type]->tab;
440 do_memp_free_pool(memp_pools[type],
mem);
442#ifdef LWIP_HOOK_MEMP_AVAILABLE
443 if (old_first == NULL) {
444 LWIP_HOOK_MEMP_AVAILABLE(type);
#define LWIP_UNUSED_ARG(x)
#define LWIP_MEM_ALIGN(addr)
#define LWIP_ALIGNMENT_CAST(target_type, val)
#define LWIP_DBG_LEVEL_SERIOUS
#define MEMP_OVERFLOW_CHECK
void * mem_malloc(mem_size_t size)
void * memp_malloc(memp_t type)
void memp_free(memp_t type, void *mem)
void memp_free_pool(const struct memp_desc *desc, void *mem)
void memp_init_pool(const struct memp_desc *desc)
void * memp_malloc_pool(const struct memp_desc *desc)
#define SYS_ARCH_DECL_PROTECT(lev)