mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-18 15:18:20 +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:
committed by
Norman Feske
parent
f23d3cb66b
commit
0971b47b11
@ -43,6 +43,13 @@ namespace Genode {
|
|||||||
|
|
||||||
Ram_dataspace_capability cap;
|
Ram_dataspace_capability cap;
|
||||||
void *local_addr;
|
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>
|
class Dataspace_pool : public List<Dataspace>
|
||||||
|
@ -34,6 +34,7 @@ Heap::Dataspace_pool::~Dataspace_pool()
|
|||||||
Ram_dataspace_capability ds_cap = ds->cap;
|
Ram_dataspace_capability ds_cap = ds->cap;
|
||||||
|
|
||||||
remove(ds);
|
remove(ds);
|
||||||
|
delete ds;
|
||||||
_rm_session->detach(ds->local_addr);
|
_rm_session->detach(ds->local_addr);
|
||||||
_ram_session->free(ds_cap);
|
_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 */
|
/* add dataspace information to list of dataspaces */
|
||||||
Dataspace *ds = reinterpret_cast<Dataspace *>(ds_addr);
|
Dataspace *ds = new (ds_addr) Dataspace(new_ds_cap, local_addr);
|
||||||
ds->cap = new_ds_cap;
|
|
||||||
ds->local_addr = local_addr;
|
|
||||||
insert(ds);
|
insert(ds);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Reference in New Issue
Block a user