81 struct memp_malloc_helper *element;
83 mem_size_t required_size = size +
sizeof(
struct memp_malloc_helper);
85 for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (
memp_t)(poolnr + 1)) {
86 #if MEM_USE_POOLS_TRY_BIGGER_POOL 91 if (required_size <= memp_sizes[poolnr]) {
95 if (poolnr > MEMP_POOL_LAST) {
96 LWIP_ASSERT(
"mem_malloc(): no pool is that big!", 0);
99 element = (
struct memp_malloc_helper*)
memp_malloc(poolnr);
100 if (element ==
NULL) {
103 #if MEM_USE_POOLS_TRY_BIGGER_POOL 105 if (poolnr < MEMP_POOL_LAST) {
114 element->poolnr = poolnr;
131 struct memp_malloc_helper *hmem = (
struct memp_malloc_helper*)rmem;
172 #define MIN_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MIN_SIZE) 173 #define SIZEOF_STRUCT_MEM LWIP_MEM_ALIGN_SIZE(sizeof(struct mem)) 174 #define MEM_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SIZE) 180 #ifndef LWIP_RAM_HEAP_POINTER 184 #define LWIP_RAM_HEAP_POINTER ram_heap 197 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 199 static volatile u8_t mem_free_count;
202 #define LWIP_MEM_FREE_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_free) 203 #define LWIP_MEM_FREE_PROTECT() SYS_ARCH_PROTECT(lev_free) 204 #define LWIP_MEM_FREE_UNPROTECT() SYS_ARCH_UNPROTECT(lev_free) 205 #define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc) 206 #define LWIP_MEM_ALLOC_PROTECT() SYS_ARCH_PROTECT(lev_alloc) 207 #define LWIP_MEM_ALLOC_UNPROTECT() SYS_ARCH_UNPROTECT(lev_alloc) 212 #define LWIP_MEM_FREE_DECL_PROTECT() 213 #define LWIP_MEM_FREE_PROTECT() sys_mutex_lock(&mem_mutex) 214 #define LWIP_MEM_FREE_UNPROTECT() sys_mutex_unlock(&mem_mutex) 216 #define LWIP_MEM_ALLOC_DECL_PROTECT() 217 #define LWIP_MEM_ALLOC_PROTECT() 218 #define LWIP_MEM_ALLOC_UNPROTECT() 247 nmem = (
struct mem *)(
void *)&ram[mem->
next];
248 if (mem != nmem && nmem->
used == 0 && (
u8_t *)nmem != (
u8_t *)ram_end) {
258 pmem = (
struct mem *)(
void *)&ram[mem->
prev];
259 if (pmem != mem && pmem->
used == 0) {
283 mem = (
struct mem *)(
void *)
ram;
294 lfree = (
struct mem *)(
void *)
ram;
351 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 407 LWIP_ASSERT(
"mem_trim can only shrink memory", newsize <= size);
408 if (newsize > size) {
412 if (newsize == size) {
420 mem2 = (
struct mem *)(
void *)&ram[mem->
next];
421 if(mem2->
used == 0) {
427 ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
429 lfree = (
struct mem *)(
void *)&ram[ptr2];
431 mem2 = (
struct mem *)(
void *)&ram[ptr2];
443 ((
struct mem *)(
void *)&ram[mem2->
next])->
prev = ptr2;
455 ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
456 mem2 = (
struct mem *)(
void *)&ram[ptr2];
465 ((
struct mem *)(
void *)&ram[mem2->
next])->
prev = ptr2;
476 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 497 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 498 u8_t local_mem_free_count = 0;
522 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 525 local_mem_free_count = 0;
532 ptr = ((
struct mem *)(
void *)&ram[ptr])->
next) {
533 mem = (
struct mem *)(
void *)&ram[ptr];
534 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 539 if (mem_free_count != 0) {
540 local_mem_free_count = mem_free_count;
563 mem2 = (
struct mem *)(
void *)&ram[ptr2];
572 ((
struct mem *)(
void *)&ram[mem2->
next])->
prev = ptr2;
589 while (lfree->
used && lfree != ram_end) {
593 lfree = (
struct mem *)(
void *)&ram[lfree->
next];
595 LWIP_ASSERT(
"mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->
used)));
599 LWIP_ASSERT(
"mem_malloc: allocated memory not above ram_end.",
601 LWIP_ASSERT(
"mem_malloc: allocated memory properly aligned.",
609 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 611 }
while(local_mem_free_count != 0);
static void ICACHE_FLASH_ATTR plug_holes(struct mem *mem)
void memp_free(memp_t type, void *mem) ICACHE_FLASH_ATTR
err_t sys_mutex_new(sys_mutex_t *mutex)
void mem_free(void *rmem)
#define LWIP_MEM_ALLOC_PROTECT()
#define LWIP_MEM_FREE_DECL_PROTECT()
#define SIZEOF_STRUCT_MEM
void sys_mutex_unlock(sys_mutex_t *mutex)
void sys_mutex_lock(sys_mutex_t *mutex)
#define ICACHE_FLASH_ATTR
void * memp_malloc(memp_t type) ICACHE_FLASH_ATTR
static struct mem * ram_end
#define MEM_STATS_AVAIL(x, y)
#define LWIP_DBG_LEVEL_SEVERE
#define SYS_ARCH_DECL_PROTECT(x)
#define LWIP_MEM_FREE_PROTECT()
u8_t ram_heap [MEM_SIZE_ALIGNED+(2 *SIZEOF_STRUCT_MEM)+MEM_ALIGNMENT SHMEM_ATTR)
void * mem_trim(void *rmem, mem_size_t newsize)
#define LWIP_MEM_ALIGN_SIZE(size)
#define LWIP_DEBUGF(debug, message)
#define LWIP_MEM_ALLOC_DECL_PROTECT()
#define LWIP_DBG_LEVEL_SERIOUS
void * mem_calloc(mem_size_t count, mem_size_t size)
static struct mem * lfree
#define SYS_ARCH_PROTECT(x)
#define LWIP_ASSERT(message, assertion)
#define LWIP_RAM_HEAP_POINTER
void * mem_malloc(mem_size_t size)
#define MEM_STATS_INC_USED(x, y)
#define MEM_STATS_DEC_USED(x, y)
#define LWIP_MEM_ALLOC_UNPROTECT()
#define SYS_ARCH_UNPROTECT(x)
#define LWIP_MEM_ALIGN(addr)
#define LWIP_MEM_FREE_UNPROTECT()