diff --git a/repos/libports/lib/mk/libc-common.inc b/repos/libports/lib/mk/libc-common.inc
index 51728194e4..9605665cff 100644
--- a/repos/libports/lib/mk/libc-common.inc
+++ b/repos/libports/lib/mk/libc-common.inc
@@ -7,6 +7,7 @@
LIBC_PORT_DIR := $(call select_from_ports,libc)
LIBC_DIR := $(LIBC_PORT_DIR)/src/lib/libc
LIBC_REP_DIR := $(realpath $(call select_from_repositories,include/libc-genode)/../..)
+EALAN_REP_DIR := $(realpath $(call select_from_repositories,ealanos))
# local libc includes
INC_DIR += $(LIBC_DIR)/lib/libc/locale
@@ -14,6 +15,7 @@ INC_DIR += $(LIBC_DIR)/lib/libc/include
INC_DIR += $(LIBC_DIR)/lib/libc/stdio
INC_DIR += $(LIBC_DIR)/lib/libc/net
INC_DIR += $(LIBC_DIR)/contrib/gdtoa
+INC_DIR += $(EALAN_REP_DIR)/include
#CC_OPT += -DGENODE_RELEASE
diff --git a/repos/libports/src/lib/libc/internal/init.h b/repos/libports/src/lib/libc/internal/init.h
index e2ad25097b..a9674dcbba 100644
--- a/repos/libports/src/lib/libc/internal/init.h
+++ b/repos/libports/src/lib/libc/internal/init.h
@@ -15,6 +15,8 @@
#define _LIBC__INTERNAL__INIT_H_
/* Genode includes */
+#include "pd_session/pd_session.h"
+#include "region_map/region_map.h"
#include
#include
#include
@@ -98,7 +100,7 @@ namespace Libc {
/**
* Malloc allocator
*/
- void init_malloc(Genode::Allocator &);
+ void init_malloc(Genode::Pd_session &pd , Genode::Region_map &rm);
void init_malloc_cloned(Clone_connection &);
void reinit_malloc(Genode::Allocator &);
diff --git a/repos/libports/src/lib/libc/internal/kernel.h b/repos/libports/src/lib/libc/internal/kernel.h
index 069ae77ef9..521c50113b 100644
--- a/repos/libports/src/lib/libc/internal/kernel.h
+++ b/repos/libports/src/lib/libc/internal/kernel.h
@@ -45,6 +45,7 @@
#include
#include
+
namespace Libc {
class Kernel;
class Main_blockade;
diff --git a/repos/libports/src/lib/libc/kernel.cc b/repos/libports/src/lib/libc/kernel.cc
index 25870f1ee1..a6554e8dc1 100644
--- a/repos/libports/src/lib/libc/kernel.cc
+++ b/repos/libports/src/lib/libc/kernel.cc
@@ -500,7 +500,7 @@ Libc::Kernel::Kernel(Genode::Env &env, Genode::Allocator &heap)
} else {
_malloc_heap.construct(*_malloc_ram, _env.rm());
- init_malloc(*_malloc_heap);
+ init_malloc(_env.pd(), _env.rm());
}
init_fork(_env, _fd_alloc, _libc_env, _heap, *_malloc_heap, _pid, *this,
diff --git a/repos/libports/src/lib/libc/malloc.cc b/repos/libports/src/lib/libc/malloc.cc
index 2998070d42..f63f8ebba8 100644
--- a/repos/libports/src/lib/libc/malloc.cc
+++ b/repos/libports/src/lib/libc/malloc.cc
@@ -13,6 +13,8 @@
*/
/* Genode includes */
+#include "pd_session/pd_session.h"
+#include "region_map/region_map.h"
#include
#include
#include
@@ -30,6 +32,7 @@ extern "C" {
#include
#include
#include
+#include
namespace Libc {
@@ -83,7 +86,7 @@ class Libc::Malloc
SLAB_START = 5, /* 32 bytes (log2) */
SLAB_STOP = 11, /* 2048 bytes (log2) */
NUM_SLABS = (SLAB_STOP - SLAB_START) + 1,
- DEFAULT_ALIGN = 16
+ DEFAULT_ALIGN = 64
};
struct Metadata
@@ -232,10 +235,11 @@ class Libc::Malloc
using namespace Libc;
+using Hamsterer = Ealan::Memory::Hamstraaja<32, 2048>;
+//static Malloc *mallocator;
-static Malloc *mallocator;
-
+static Hamsterer *mallocator;
extern "C" void *malloc(size_t size)
{
@@ -267,13 +271,21 @@ extern "C" void *realloc(void *ptr, size_t size)
return nullptr;
}
- return mallocator->realloc(ptr, size);
+ void *new_addr = mallocator->alloc(size);
+
+ if (new_addr) {
+ ::memcpy(new_addr, ptr, size);
+ free(ptr);
+ }
+
+ return new_addr;
+ //return mallocator->realloc(ptr, size);
}
int posix_memalign(void **memptr, size_t alignment, size_t size)
{
- *memptr = mallocator->alloc(size, alignment);
+ *memptr = mallocator->aligned_alloc(size, alignment);
if (!*memptr)
return Errno(ENOMEM);
@@ -283,19 +295,19 @@ int posix_memalign(void **memptr, size_t alignment, size_t size)
/* space for singleton object w/o destructor */
-static long _malloc_obj[(sizeof(Malloc) + sizeof(long))/sizeof(long)];
+static long _malloc_obj[(sizeof(Hamsterer) + sizeof(long))/sizeof(long)];
-void Libc::init_malloc(Genode::Allocator &heap)
+void Libc::init_malloc(Genode::Pd_session &pd, Genode::Region_map &rm)
{
- mallocator = construct_at(_malloc_obj, heap);
+ mallocator = construct_at(_malloc_obj, pd, rm);
}
void Libc::init_malloc_cloned(Clone_connection &clone_connection)
{
clone_connection.object_content(_malloc_obj);
- mallocator = (Malloc *)_malloc_obj;
+ mallocator = (Hamsterer *)_malloc_obj;
}