From 0d9e566b1840a12000cfd07b497c52c962f470ae Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Mon, 5 Dec 2016 13:26:53 +0100 Subject: [PATCH] wm: fix possible deadlock Fixes #2183 --- repos/gems/src/server/wm/nitpicker.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/repos/gems/src/server/wm/nitpicker.h b/repos/gems/src/server/wm/nitpicker.h index 96b5c2d464..8804e6de91 100644 --- a/repos/gems/src/server/wm/nitpicker.h +++ b/repos/gems/src/server/wm/nitpicker.h @@ -128,7 +128,7 @@ class Wm::Nitpicker::View : public Genode::Weak_object, /** * Apply cached view state to the physical nitpicker view */ - void _apply_view_config() + void _unsynchronized_apply_view_config(Locked_ptr &neighbor) { if (!_real_handle.valid()) return; @@ -139,7 +139,6 @@ class Wm::Nitpicker::View : public Genode::Weak_object, View_handle real_neighbor_handle; - Locked_ptr neighbor(_neighbor_ptr); if (neighbor.valid()) real_neighbor_handle = _real_nitpicker.view_handle(neighbor->real_view_cap()); @@ -154,6 +153,12 @@ class Wm::Nitpicker::View : public Genode::Weak_object, _real_nitpicker.release_view_handle(real_neighbor_handle); } + void _apply_view_config() + { + Locked_ptr neighbor(_neighbor_ptr); + _unsynchronized_apply_view_config(neighbor); + } + public: ~View() @@ -402,7 +407,10 @@ class Wm::Nitpicker::Child_view : public View, _real_nitpicker.release_view_handle(parent_handle); - _apply_view_config(); + if (_neighbor_ptr == _parent) + _unsynchronized_apply_view_config(parent); + else + _apply_view_config(); } void update_child_stacking()