mirror of
https://github.com/genodelabs/genode.git
synced 2025-03-22 03:55:26 +00:00
parent
e822a36c4e
commit
99fbb23ec5
@ -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:
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user