From 8afcbce01e8fd5832224ed09dee48942be865d5f Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Sun, 16 Jun 2013 15:02:50 +0200 Subject: [PATCH] seoul: implement heap_free Avoids the message cxx: operator delete (void *) called - not implemented. A working implementation is available in the 'stdcxx' library during a " new ..." which causes exceptions. Happens for seoul in disk.cc Issue #806 --- ports/src/vancouver/nova_user_env.cc | 17 ++++++++++++++++- ports/src/vancouver/service/memory.h | 2 -- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ports/src/vancouver/nova_user_env.cc b/ports/src/vancouver/nova_user_env.cc index ba11ace5c..9761c13f0 100644 --- a/ports/src/vancouver/nova_user_env.cc +++ b/ports/src/vancouver/nova_user_env.cc @@ -82,7 +82,7 @@ void Logging::panic(const char *format, ...) } -void *heap_alloc(size_t size) +static void *heap_alloc(size_t size) { void *res = Genode::env()->heap()->alloc(size); if (res) @@ -92,6 +92,16 @@ void *heap_alloc(size_t size) Genode::sleep_forever(); } +static void heap_free(void * ptr) +{ + if (Genode::env()->heap()->need_size_for_free()) { + PWRN("leaking memory"); + return; + } + + Genode::env()->heap()->free(ptr, 0); +} + void *operator new[](size_t size) { @@ -129,6 +139,11 @@ void operator delete[](void *ptr) PWRN("delete[] not implemented"); } +void operator delete (void * ptr) +{ + heap_free(ptr); +} + void do_exit(char const *msg) { diff --git a/ports/src/vancouver/service/memory.h b/ports/src/vancouver/service/memory.h index 48bf15ea4..38f174067 100644 --- a/ports/src/vancouver/service/memory.h +++ b/ports/src/vancouver/service/memory.h @@ -16,8 +16,6 @@ struct Aligned { Aligned(size_t alignment) : alignment(alignment) {} }; -void *heap_alloc(size_t size); - void *operator new[](size_t size); void *operator new[](size_t size, Aligned const alignment);