Use placement new for Heap::Dataspace (fix #203)

This commit introduces placement new/delete, and a constructor for
Heap::Dataspace objects. It fixes the usage of uninitialized Dataspace
objects when expanding the heap that lead to problems in conjunction
with Native_capability smart-pointer in base-foc. Please refer to
issue #203.
This commit is contained in:
Stefan Kalkowski 2012-05-10 15:48:05 +02:00 committed by Norman Feske
parent f23d3cb66b
commit 0971b47b11
2 changed files with 9 additions and 3 deletions

View File

@ -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<Dataspace>

View File

@ -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<Dataspace *>(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;