mirror of
git://uclibc.org/uClibc.git
synced 2026-01-19 00:08:21 +08:00
52 lines
1.4 KiB
C
52 lines
1.4 KiB
C
/*
|
|
* libc/stdlib/malloc/heap_alloc.c -- allocate memory from a heap
|
|
*
|
|
* Copyright (C) 2002 NEC Corporation
|
|
* Copyright (C) 2002 Miles Bader <miles@gnu.org>
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License. See the file COPYING.LIB in the main
|
|
* directory of this archive for more details.
|
|
*
|
|
* Written by Miles Bader <miles@gnu.org>
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "heap.h"
|
|
|
|
|
|
/* Allocate and return a block at least *SIZE bytes long from HEAP.
|
|
*SIZE is adjusted to reflect the actual amount allocated (which may be
|
|
greater than requested). */
|
|
void *
|
|
__heap_alloc (struct heap_free_area **heap, size_t *size)
|
|
{
|
|
struct heap_free_area *fa;
|
|
size_t _size = *size;
|
|
void *mem = 0;
|
|
|
|
_size = HEAP_ADJUST_SIZE (_size);
|
|
|
|
if (_size < sizeof (struct heap_free_area))
|
|
/* Because we sometimes must use a freed block to hold a free-area node,
|
|
we must make sure that every allocated block can hold one. */
|
|
_size = HEAP_ADJUST_SIZE (sizeof (struct heap_free_area));
|
|
|
|
HEAP_DEBUG (*heap, "before __heap_alloc");
|
|
|
|
/* Look for a free area that can contain _SIZE bytes. */
|
|
for (fa = *heap; fa; fa = fa->next)
|
|
if (fa->size >= _size)
|
|
{
|
|
/* Found one! */
|
|
mem = HEAP_FREE_AREA_START (fa);
|
|
*size = __heap_free_area_alloc (heap, fa, _size);
|
|
break;
|
|
}
|
|
|
|
HEAP_DEBUG (*heap, "after __heap_alloc");
|
|
|
|
return mem;
|
|
}
|