Skip to content
Snippets Groups Projects
Commit 7a5d8fe2 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

implement a naive realloc() to make the malloc testcase happy

parent 7eb45bd6
No related branches found
No related tags found
No related merge requests found
......@@ -68,6 +68,11 @@ void* pool::alloc()
return obj;
}
unsigned pool::get_size()
{
return _size;
}
void pool::add_page()
{
void* page = alloc_page();
......@@ -197,6 +202,13 @@ void free_large(void* obj)
}
}
unsigned large_object_size(void *obj)
{
obj -= page_size;
auto header = static_cast<page_range*>(obj);
return header->size;
}
void* alloc_page()
{
assert(!free_page_ranges.empty());
......@@ -293,6 +305,35 @@ void* calloc(size_t nmemb, size_t size)
return p;
}
static size_t object_size(void *object)
{
if (reinterpret_cast<uintptr_t>(object) & (memory::page_size - 1)) {
return memory::pool::from_object(object)->get_size();
} else {
return memory::large_object_size(object);
}
}
void* realloc(void* object, size_t size)
{
if (!object)
return malloc(size);
if (!size) {
free(object);
return NULL;
}
size_t old_size = object_size(object);
size_t copy_size = size > old_size ? old_size : size;
void* ptr = malloc(size);
if (ptr) {
memcpy(ptr, object, copy_size);
free(object);
}
return NULL;
}
void free(void* object)
{
if (!object) {
......
......@@ -27,6 +27,7 @@ public:
~pool();
void* alloc();
void free(void* object);
unsigned get_size();
static pool* from_object(void* object);
private:
struct page_header;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment