From 0ab49dff3a0b7573c0910f7eb24b071fe302a876 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Sat, 21 Nov 2015 11:17:13 +0100 Subject: [PATCH] nitpicker: reflect Handle_registry::Out_of_memory In the event where a nitpicker session's quota was depleted by the allocation of view handles, nitpicker would abort. The patch prevents the abort by reflecting this condition as an Out_of_metadata exception to the client. This way, the client can upgrade its session as needed. The problem was triggered by running the decorator_stress test (changed to generate 40 windows) with the themed_decorator. --- repos/os/src/server/nitpicker/main.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/repos/os/src/server/nitpicker/main.cc b/repos/os/src/server/nitpicker/main.cc index 8c64f97eb..992c7cd8f 100644 --- a/repos/os/src/server/nitpicker/main.cc +++ b/repos/os/src/server/nitpicker/main.cc @@ -776,6 +776,8 @@ class Nitpicker::Session_component : public Genode::Rpc_object, } catch (View_handle_registry::Lookup_failed) { return View_handle(); } + catch (View_handle_registry::Out_of_memory) { + throw Nitpicker::Session::Out_of_metadata(); } catch (Genode::Allocator::Out_of_memory) { throw Nitpicker::Session::Out_of_metadata(); } } @@ -799,7 +801,9 @@ class Nitpicker::Session_component : public Genode::Rpc_object, _view_list.insert(view); _ep.manage(view); - return _view_handle_registry.alloc(*view); + try { return _view_handle_registry.alloc(*view); } + catch (View_handle_registry::Out_of_memory) { + throw Nitpicker::Session::Out_of_metadata(); } } void destroy_view(View_handle handle) override @@ -835,7 +839,10 @@ class Nitpicker::Session_component : public Genode::Rpc_object, return (view) ? _view_handle_registry.alloc(*view, handle) : View_handle(); }; - return _ep.apply(view_cap, lambda); + + try { return _ep.apply(view_cap, lambda); } + catch (View_handle_registry::Out_of_memory) { + throw Nitpicker::Session::Out_of_metadata(); } } View_capability view_capability(View_handle handle) override