mm: Call memalign in malloc if ARCH_ADDRENV and BUILD_KERNEL are defined
to reuse the sbrk logic inside memalign Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
parent
b3f568c216
commit
7b20a0d789
|
@ -52,41 +52,12 @@
|
||||||
FAR void *malloc(size_t size)
|
FAR void *malloc(size_t size)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL)
|
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL)
|
||||||
FAR void *brkaddr;
|
/* Use memalign() because it implements the sbrk() logic */
|
||||||
FAR void *mem;
|
|
||||||
|
|
||||||
if (size < 1)
|
return memalign(sizeof(FAR void *), size);
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Loop until we successfully allocate the memory or until an error
|
|
||||||
* occurs. If we fail to allocate memory on the first pass, then call
|
|
||||||
* sbrk to extend the heap by one page. This may require several
|
|
||||||
* passes if more the size of the allocation is more than one page.
|
|
||||||
*
|
|
||||||
* An alternative would be to increase the size of the heap by the
|
|
||||||
* full requested allocation in sbrk(). Then the loop should never
|
|
||||||
* execute more than twice (but more memory than we need may be
|
|
||||||
* allocated).
|
|
||||||
*/
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
mem = mm_malloc(USR_HEAP, size);
|
|
||||||
if (!mem)
|
|
||||||
{
|
|
||||||
brkaddr = sbrk(size);
|
|
||||||
if (brkaddr == (FAR void *)-1)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (mem == NULL);
|
|
||||||
|
|
||||||
return mem;
|
|
||||||
#else
|
#else
|
||||||
|
/* Use mm_malloc() because it implements the clear */
|
||||||
|
|
||||||
return mm_malloc(USR_HEAP, size);
|
return mm_malloc(USR_HEAP, size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue