diff --git a/repos/base/src/core/include/region_map_component.h b/repos/base/src/core/include/region_map_component.h index f0c7f8f0f5..4346b38438 100644 --- a/repos/base/src/core/include/region_map_component.h +++ b/repos/base/src/core/include/region_map_component.h @@ -114,10 +114,10 @@ class Genode::Rm_faulter : public Fifo::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 _faulting_region_map; + Region_map::State _fault_state; public: @@ -129,7 +129,7 @@ class Genode::Rm_faulter : public Fifo::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, +class Genode::Region_map_component : public Genode::Weak_object, + public Rpc_object, public List::Element { private: diff --git a/repos/base/src/core/region_map_component.cc b/repos/base/src/core/region_map_component.cc index 2a8dba824e..0c8ff56b8a 100644 --- a/repos/base/src/core/region_map_component.cc +++ b/repos/base/src/core/region_map_component.cc @@ -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 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(); } @@ -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(); _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 {