mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-08 11:55:24 +00:00
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:
parent
f23d3cb66b
commit
0971b47b11
@ -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>
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user