aos/lib/aos/morecore.c

136 lines
3.1 KiB
C

/**
* \file
* \brief Morecore implementation for malloc
*/
/*
* Copyright (c) 2007, 2008, 2009, 2010, 2011, 2019 ETH Zurich.
* Copyright (c) 2014, HP Labs.
* All rights reserved.
*
* This file is distributed under the terms in the attached LICENSE file.
* If you do not find this file, copies can be found by writing to:
* ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
*/
#include <aos/aos.h>
#include <aos/core_state.h>
#include <aos/morecore.h>
#include <stdio.h>
typedef void *(*morecore_alloc_func_t)(size_t bytes, size_t *retbytes);
extern morecore_alloc_func_t sys_morecore_alloc;
typedef void (*morecore_free_func_t)(void *base, size_t bytes);
extern morecore_free_func_t sys_morecore_free;
// this define makes morecore use an implementation that just has a static
// 16MB heap.
// (M4): use a dynamic heap instead,
//#define USE_STATIC_HEAP
#ifdef USE_STATIC_HEAP
// dummy mini heap (16M)
#define HEAP_SIZE (1<<24)
static char mymem[HEAP_SIZE] = { 0 };
static char *endp = mymem + HEAP_SIZE;
/**
* \brief Allocate some memory for malloc to use
*
* This function will keep trying with smaller and smaller frames till
* it finds a set of frames that satisfy the requirement. retbytes can
* be smaller than bytes if we were able to allocate a smaller memory
* region than requested for.
*/
static void *morecore_alloc(size_t bytes, size_t *retbytes)
{
struct morecore_state *state = get_morecore_state();
size_t aligned_bytes = ROUND_UP(bytes, sizeof(Header));
void *ret = NULL;
if (state->freep + aligned_bytes < endp) {
ret = state->freep;
state->freep += aligned_bytes;
}
else {
aligned_bytes = 0;
}
*retbytes = aligned_bytes;
return ret;
}
static void morecore_free(void *base, size_t bytes)
{
return;
}
errval_t morecore_init(size_t alignment)
{
struct morecore_state *state = get_morecore_state();
debug_printf("initializing static heap\n");
thread_mutex_init(&state->mutex);
state->freep = mymem;
sys_morecore_alloc = morecore_alloc;
sys_morecore_free = morecore_free;
return SYS_ERR_OK;
}
errval_t morecore_reinit(void)
{
return SYS_ERR_OK;
}
#else
// dynamic heap using lib/aos/paging features
/**
* \brief Allocate some memory for malloc to use
*
* This function will keep trying with smaller and smaller frames till
* it finds a set of frames that satisfy the requirement. retbytes can
* be smaller than bytes if we were able to allocate a smaller memory
* region than requested for.
*/
static void *morecore_alloc(size_t bytes, size_t *retbytes)
{
return paging_malloc(bytes, retbytes, 0);
}
static void morecore_free(void *base, size_t bytes)
{
}
errval_t morecore_init(size_t alignment)
{
struct morecore_state *state = get_morecore_state();
debug_printf("initializing dynamic heap\n");
thread_mutex_init(&state->mutex);
sys_morecore_alloc = morecore_alloc;
sys_morecore_free = morecore_free;
return SYS_ERR_OK;
}
errval_t morecore_reinit(void)
{
return SYS_ERR_OK;
}
#endif
Header *get_malloc_freep(void);
Header *get_malloc_freep(void)
{
return get_morecore_state()->header_freep;
}