core: use weak_ptr for Rm_faulter and Region_map

Fixes #2086
This commit is contained in:
Alexander Boettcher 2016-09-09 17:49:34 +02:00 committed by Christian Helmuth
parent e822a36c4e
commit 99fbb23ec5
2 changed files with 18 additions and 11 deletions

View File

@ -114,10 +114,10 @@ class Genode::Rm_faulter : public Fifo<Rm_faulter>::Element
{
private:
Pager_object *_pager_object;
Lock _lock;
Region_map_component *_faulting_region_map;
Region_map::State _fault_state;
Pager_object *_pager_object;
Lock _lock;
Weak_ptr<Region_map_component> _faulting_region_map;
Region_map::State _fault_state;
public:
@ -129,7 +129,7 @@ class Genode::Rm_faulter : public Fifo<Rm_faulter>::Element
* Currently, there is only one pager in core.
*/
Rm_faulter(Pager_object *pager_object) :
_pager_object(pager_object), _faulting_region_map(0) { }
_pager_object(pager_object) { }
/**
* Assign fault state
@ -218,7 +218,8 @@ class Genode::Rm_client : public Pager_object, public Rm_faulter,
};
class Genode::Region_map_component : public Rpc_object<Region_map>,
class Genode::Region_map_component : public Genode::Weak_object<Genode::Region_map_component>,
public Rpc_object<Region_map>,
public List<Region_map_component>::Element
{
private:

View File

@ -273,7 +273,7 @@ void Rm_faulter::fault(Region_map_component *faulting_region_map,
{
Lock::Guard lock_guard(_lock);
_faulting_region_map = faulting_region_map;
_faulting_region_map = faulting_region_map->weak_ptr();
_fault_state = fault_state;
_pager_object->unresolved_page_fault_occurred();
@ -285,10 +285,14 @@ void Rm_faulter::dissolve_from_faulting_region_map(Region_map_component * caller
/* serialize access */
Lock::Guard lock_guard(_lock);
if (_faulting_region_map)
_faulting_region_map->discard_faulter(this, _faulting_region_map != caller);
{
Locked_ptr<Region_map_component> locked_ptr(_faulting_region_map);
_faulting_region_map = 0;
if (locked_ptr.valid())
locked_ptr->discard_faulter(this, &*locked_ptr != caller);
}
_faulting_region_map = Genode::Weak_ptr<Genode::Region_map_component>();
}
@ -297,7 +301,7 @@ void Rm_faulter::continue_after_resolved_fault()
Lock::Guard lock_guard(_lock);
_pager_object->wake_up();
_faulting_region_map = 0;
_faulting_region_map = Genode::Weak_ptr<Genode::Region_map_component>();
_fault_state = Region_map::State();
}
@ -654,6 +658,8 @@ Region_map_component::~Region_map_component()
{
_ds_ep->dissolve(this);
lock_for_destruction();
/* dissolve all clients from pager entrypoint */
Rm_client *cl;
do {