mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-09-28 23:00:50 +00:00
Add MEM_CUSTOM_ALLOCATOR and make LIBC a subset of it
Allow one to provide a custom implementation of free/malloc/calloc instead of the lwip internal allocator. The code to use the libc's implementation already existed, so generalize the existing code and make the libc variant a specialized case of this new capability, retaining full backwards compatibility.
This commit is contained in:
parent
e01c9a9504
commit
4f88651247
@ -196,8 +196,11 @@ PACK_STRUCT_END
|
|||||||
#if (LWIP_ALTCP && LWIP_EVENT_API)
|
#if (LWIP_ALTCP && LWIP_EVENT_API)
|
||||||
#error "The application layered tcp API does not work with LWIP_EVENT_API"
|
#error "The application layered tcp API does not work with LWIP_EVENT_API"
|
||||||
#endif
|
#endif
|
||||||
#if (MEM_LIBC_MALLOC && MEM_USE_POOLS)
|
#if (MEM_CUSTOM_ALLOCATOR && !(defined(MEM_CUSTOM_FREE) && defined(MEM_CUSTOM_MALLOC) && defined(MEM_CUSTOM_CALLOC)))
|
||||||
#error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h"
|
#error "All of MEM_CUSTOM_FREE/MEM_CUSTOM_MALLOC/MEM_CUSTOM_CALLOC must be provided if MEM_CUSTOM_ALLOCATOR is enabled in your lwipopts.h"
|
||||||
|
#endif
|
||||||
|
#if (MEM_USE_POOLS && MEM_CUSTOM_ALLOCATOR)
|
||||||
|
#error "MEM_USE_POOLS may not be used with a custom allocator (MEM_CUSTOM_ALLOCATOR or MEM_LIBC_MALLOC) enabled in your lwipopts.h"
|
||||||
#endif
|
#endif
|
||||||
#if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS)
|
#if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS)
|
||||||
#error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h"
|
#error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h"
|
||||||
|
@ -152,7 +152,7 @@ mem_overflow_init_raw(void *p, size_t size)
|
|||||||
}
|
}
|
||||||
#endif /* MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK */
|
#endif /* MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK */
|
||||||
|
|
||||||
#if MEM_LIBC_MALLOC || MEM_USE_POOLS
|
#if MEM_CUSTOM_ALLOCATOR || MEM_USE_POOLS
|
||||||
|
|
||||||
/** mem_init is not used when using pools instead of a heap or using
|
/** mem_init is not used when using pools instead of a heap or using
|
||||||
* C library malloc().
|
* C library malloc().
|
||||||
@ -172,23 +172,9 @@ mem_trim(void *mem, mem_size_t size)
|
|||||||
LWIP_UNUSED_ARG(size);
|
LWIP_UNUSED_ARG(size);
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
#endif /* MEM_LIBC_MALLOC || MEM_USE_POOLS */
|
#endif /* MEM_CUSTOM_ALLOCATOR || MEM_USE_POOLS */
|
||||||
|
|
||||||
#if MEM_LIBC_MALLOC
|
#if MEM_CUSTOM_ALLOCATOR
|
||||||
/* lwIP heap implemented using C library malloc() */
|
|
||||||
|
|
||||||
/* in case C library malloc() needs extra protection,
|
|
||||||
* allow these defines to be overridden.
|
|
||||||
*/
|
|
||||||
#ifndef mem_clib_free
|
|
||||||
#define mem_clib_free free
|
|
||||||
#endif
|
|
||||||
#ifndef mem_clib_malloc
|
|
||||||
#define mem_clib_malloc malloc
|
|
||||||
#endif
|
|
||||||
#ifndef mem_clib_calloc
|
|
||||||
#define mem_clib_calloc calloc
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_STATS && MEM_STATS
|
#if LWIP_STATS && MEM_STATS
|
||||||
#define MEM_LIBC_STATSHELPER_SIZE LWIP_MEM_ALIGN_SIZE(sizeof(mem_size_t))
|
#define MEM_LIBC_STATSHELPER_SIZE LWIP_MEM_ALIGN_SIZE(sizeof(mem_size_t))
|
||||||
@ -207,7 +193,7 @@ mem_trim(void *mem, mem_size_t size)
|
|||||||
void *
|
void *
|
||||||
mem_malloc(mem_size_t size)
|
mem_malloc(mem_size_t size)
|
||||||
{
|
{
|
||||||
void *ret = mem_clib_malloc(size + MEM_LIBC_STATSHELPER_SIZE);
|
void *ret = MEM_CUSTOM_MALLOC(size + MEM_LIBC_STATSHELPER_SIZE);
|
||||||
if (ret == NULL) {
|
if (ret == NULL) {
|
||||||
MEM_STATS_INC_LOCKED(err);
|
MEM_STATS_INC_LOCKED(err);
|
||||||
} else {
|
} else {
|
||||||
@ -234,7 +220,7 @@ mem_free(void *rmem)
|
|||||||
rmem = (u8_t *)rmem - MEM_LIBC_STATSHELPER_SIZE;
|
rmem = (u8_t *)rmem - MEM_LIBC_STATSHELPER_SIZE;
|
||||||
MEM_STATS_DEC_USED_LOCKED(used, *(mem_size_t *)rmem);
|
MEM_STATS_DEC_USED_LOCKED(used, *(mem_size_t *)rmem);
|
||||||
#endif
|
#endif
|
||||||
mem_clib_free(rmem);
|
MEM_CUSTOM_FREE(rmem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif MEM_USE_POOLS
|
#elif MEM_USE_POOLS
|
||||||
@ -978,14 +964,14 @@ mem_malloc_adjust_lfree:
|
|||||||
|
|
||||||
#endif /* MEM_USE_POOLS */
|
#endif /* MEM_USE_POOLS */
|
||||||
|
|
||||||
#if MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS)
|
#if MEM_CUSTOM_ALLOCATOR && (!LWIP_STATS || !MEM_STATS)
|
||||||
void *
|
void *
|
||||||
mem_calloc(mem_size_t count, mem_size_t size)
|
mem_calloc(mem_size_t count, mem_size_t size)
|
||||||
{
|
{
|
||||||
return mem_clib_calloc(count, size);
|
return MEM_CUSTOM_CALLOC(count, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS) */
|
#else /* MEM_CUSTOM_ALLOCATOR && (!LWIP_STATS || !MEM_STATS) */
|
||||||
/**
|
/**
|
||||||
* Contiguously allocates enough space for count objects that are size bytes
|
* Contiguously allocates enough space for count objects that are size bytes
|
||||||
* of memory each and returns a pointer to the allocated memory.
|
* of memory each and returns a pointer to the allocated memory.
|
||||||
@ -1015,4 +1001,4 @@ mem_calloc(mem_size_t count, mem_size_t size)
|
|||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
#endif /* MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS) */
|
#endif /* MEM_CUSTOM_ALLOCATOR && (!LWIP_STATS || !MEM_STATS) */
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MEM_LIBC_MALLOC
|
#if MEM_CUSTOM_ALLOCATOR
|
||||||
|
|
||||||
#include "lwip/arch.h"
|
#include "lwip/arch.h"
|
||||||
|
|
||||||
|
@ -245,10 +245,28 @@
|
|||||||
/**
|
/**
|
||||||
* MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library
|
* MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library
|
||||||
* instead of the lwip internal allocator. Can save code size if you
|
* instead of the lwip internal allocator. Can save code size if you
|
||||||
* already use it.
|
* already use it. Specialized case of MEM_CUSTOM_ALLOCATOR.
|
||||||
|
* @see MEM_CUSTOM_ALLOCATOR
|
||||||
*/
|
*/
|
||||||
#if !defined MEM_LIBC_MALLOC || defined __DOXYGEN__
|
#if !defined MEM_LIBC_MALLOC || defined __DOXYGEN__
|
||||||
#define MEM_LIBC_MALLOC 0
|
#define MEM_LIBC_MALLOC 0
|
||||||
|
#elif MEM_LIBC_MALLOC
|
||||||
|
#define MEM_CUSTOM_ALLOCATOR 1
|
||||||
|
#define MEM_CUSTOM_FREE free
|
||||||
|
#define MEM_CUSTOM_MALLOC malloc
|
||||||
|
#define MEM_CUSTOM_CALLOC calloc
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MEM_CUSTOM_ALLOCATOR==1: Use malloc/free/realloc provided by a custom
|
||||||
|
* implementation instead of the lwip internal allocator. Can save code size if
|
||||||
|
* you already use it. If enabled, you have to define those functions:
|
||||||
|
* \#define MEM_CUSTOM_FREE my_free
|
||||||
|
* \#define MEM_CUSTOM_MALLOC my_malloc
|
||||||
|
* \#define MEM_CUSTOM_CALLOC my_calloc
|
||||||
|
*/
|
||||||
|
#if !defined MEM_CUSTOM_ALLOCATOR || defined __DOXYGEN__
|
||||||
|
#define MEM_CUSTOM_ALLOCATOR 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2238,7 +2256,7 @@
|
|||||||
* MEM_STATS==1: Enable mem.c stats.
|
* MEM_STATS==1: Enable mem.c stats.
|
||||||
*/
|
*/
|
||||||
#if !defined MEM_STATS || defined __DOXYGEN__
|
#if !defined MEM_STATS || defined __DOXYGEN__
|
||||||
#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
|
#define MEM_STATS ((MEM_CUSTOM_ALLOCATOR == 0) && (MEM_USE_POOLS == 0))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user