66 lines
1.3 KiB
C++
66 lines
1.3 KiB
C++
/*
|
|
* \brief Mini C malloc() and free()
|
|
* \author Norman Feske
|
|
* \date 2006-07-21
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2006-2017 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU Affero General Public License version 3.
|
|
*/
|
|
|
|
#include <base/log.h>
|
|
#include <util/string.h>
|
|
#include <mini_c/init.h>
|
|
|
|
using namespace Genode;
|
|
|
|
static Allocator *_alloc_ptr;
|
|
static Allocator &alloc()
|
|
{
|
|
if (_alloc_ptr)
|
|
return *_alloc_ptr;
|
|
|
|
error("missing call of mini_c_init");
|
|
class Missing_mini_c_init { };
|
|
throw Missing_mini_c_init();
|
|
}
|
|
|
|
|
|
void mini_c_init(Allocator &alloc) { _alloc_ptr = &alloc; }
|
|
|
|
|
|
extern "C" void *malloc(size_t size)
|
|
{
|
|
/*
|
|
* We store the size of the allocation at the very
|
|
* beginning of the allocated block and return
|
|
* the subsequent address. This way, we can retrieve
|
|
* the size information when freeing the block.
|
|
*/
|
|
unsigned long real_size = size + sizeof(unsigned long);
|
|
void *addr = 0;
|
|
if (!alloc().alloc(real_size, &addr))
|
|
return 0;
|
|
|
|
*(unsigned long *)addr = real_size;
|
|
return (unsigned long *)addr + 1;
|
|
}
|
|
|
|
|
|
extern "C" void *calloc(size_t nmemb, size_t size)
|
|
{
|
|
void *addr = malloc(nmemb*size);
|
|
memset(addr, 0, nmemb*size);
|
|
return addr;
|
|
}
|
|
|
|
|
|
extern "C" void free(void *ptr)
|
|
{
|
|
unsigned long *addr = ((unsigned long *)ptr) - 1;
|
|
alloc().free(addr, *addr);
|
|
}
|