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

View File

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