mirror of
https://github.com/genodelabs/genode.git
synced 2025-03-28 06:39:14 +00:00
parent
e822a36c4e
commit
99fbb23ec5
repos/base/src/core
@ -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:
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user