diff --git a/base/include/base/heap.h b/base/include/base/heap.h index 14e4efb4b..f18a2c0d4 100644 --- a/base/include/base/heap.h +++ b/base/include/base/heap.h @@ -43,6 +43,13 @@ namespace Genode { Ram_dataspace_capability cap; void *local_addr; + + Dataspace(Ram_dataspace_capability c, void *a) + : cap(c), local_addr(a) {} + + inline void * operator new(Genode::size_t, void* addr) { + return addr; } + inline void operator delete(void*) { } }; class Dataspace_pool : public List diff --git a/base/src/base/heap/heap.cc b/base/src/base/heap/heap.cc index 9e859182d..1f44ebe3b 100644 --- a/base/src/base/heap/heap.cc +++ b/base/src/base/heap/heap.cc @@ -34,6 +34,7 @@ Heap::Dataspace_pool::~Dataspace_pool() Ram_dataspace_capability ds_cap = ds->cap; remove(ds); + delete ds; _rm_session->detach(ds->local_addr); _ram_session->free(ds_cap); } @@ -66,9 +67,7 @@ int Heap::Dataspace_pool::expand(size_t size, Range_allocator *alloc) } /* add dataspace information to list of dataspaces */ - Dataspace *ds = reinterpret_cast(ds_addr); - ds->cap = new_ds_cap; - ds->local_addr = local_addr; + Dataspace *ds = new (ds_addr) Dataspace(new_ds_cap, local_addr); insert(ds); return 0;