From e4a1904456bc788c8881e986778c8305aa6b08ae Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Thu, 8 Dec 2016 14:27:43 +0100 Subject: [PATCH] core: fix deadlock in region_map destruction Introduced by: commit 99fbb23ec53bd5f10038890c4d9986613b4548f7 Author: Alexander Boettcher Date: Fri Sep 9 17:49:34 2016 +0200 core: use weak_ptr for Rm_faulter and Region_map Issue #2086 --- repos/base/src/core/region_map_component.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/repos/base/src/core/region_map_component.cc b/repos/base/src/core/region_map_component.cc index 004442d8ea..afe536da48 100644 --- a/repos/base/src/core/region_map_component.cc +++ b/repos/base/src/core/region_map_component.cc @@ -285,11 +285,14 @@ void Rm_faulter::dissolve_from_faulting_region_map(Region_map_component * caller /* serialize access */ Lock::Guard lock_guard(_lock); - { + enum { DO_LOCK = true }; + if (caller == static_cast(_faulting_region_map.obj())) { + caller->discard_faulter(this, !DO_LOCK); + } else { Locked_ptr locked_ptr(_faulting_region_map); if (locked_ptr.valid()) - locked_ptr->discard_faulter(this, &*locked_ptr != caller); + locked_ptr->discard_faulter(this, DO_LOCK); } _faulting_region_map = Genode::Weak_ptr();