diff --git a/repos/os/include/sandbox/sandbox.h b/repos/os/include/sandbox/sandbox.h index d2afe0ded3..b9fd6bf4b3 100644 --- a/repos/os/include/sandbox/sandbox.h +++ b/repos/os/include/sandbox/sandbox.h @@ -209,26 +209,13 @@ class Genode::Sandbox::Local_service_base : public Service using Resources = Session::Resources; - struct Request_fn : Interface - { - virtual void with_requested_session(Request &) = 0; - }; + using With_request = Callable; + using With_upgrade = Callable; + using With_close = Callable; - void _for_each_requested_session(Request_fn &); - - struct Upgrade_fn : Interface - { - virtual Upgrade_response with_upgraded_session(Session &, Resources) = 0; - }; - - void _for_each_upgraded_session(Upgrade_fn &); - - struct Close_fn : Interface - { - virtual Close_response close_session(Session &) = 0; - }; - - void _for_each_session_to_close(Close_fn &); + void _for_each_requested_session(With_request::Ft const &); + void _for_each_upgraded_session (With_upgrade::Ft const &); + void _for_each_session_to_close (With_close::Ft const &); Id_space _server_id_space { }; @@ -255,21 +242,9 @@ struct Genode::Sandbox::Local_service : private Local_service_base * ('resources', 'label', 'diag') and allows the caller to respond * to the session request ('deliver_session', 'deny'). */ - template - void for_each_requested_session(FN const &fn) + void for_each_requested_session(auto const &fn) { - struct Untyped_fn : Local_service_base::Request_fn - { - FN const &_fn; - Untyped_fn(FN const &fn) : _fn(fn) { } - - void with_requested_session(Request &request) override - { - _fn(request); - } - } untyped_fn(fn); - - _for_each_requested_session(untyped_fn); + _for_each_requested_session(With_request::Fn { fn }); } /** @@ -281,22 +256,11 @@ struct Genode::Sandbox::Local_service : private Local_service_base * * The functor must return an 'Upgrade_response'. */ - template - void for_each_upgraded_session(FN const &fn) + void for_each_upgraded_session(auto const &fn) { - struct Untyped_fn : Local_service_base::Upgrade_fn - { - FN const &_fn; - Untyped_fn(FN const &fn) : _fn(fn) { } - - Upgrade_response with_upgraded_session(Session &session, - Resources resources) override - { - return _fn(static_cast(session), resources); - } - } untyped_fn(fn); - - _for_each_upgraded_session(untyped_fn); + _for_each_upgraded_session(With_upgrade::Fn { + [&] (Session &session, Resources const &resources) { + return fn(static_cast(session), resources); } }); } /** @@ -305,21 +269,11 @@ struct Genode::Sandbox::Local_service : private Local_service_base * The functor is called with a reference to the session object (type * 'ST') as argument and must return a 'Close_response'. */ - template - void for_each_session_to_close(FN const &fn) + void for_each_session_to_close(auto const &fn) { - struct Untyped_fn : Local_service_base::Close_fn - { - FN const &_fn; - Untyped_fn(FN const &fn) : _fn(fn) { } - - Close_response close_session(Session &session) override - { - return _fn(static_cast(session)); - } - } untyped_fn(fn); - - _for_each_session_to_close(untyped_fn); + _for_each_session_to_close(With_close::Fn { + [&] (Session &session) { + return fn(static_cast(session)); } }); } }; diff --git a/repos/os/lib/symbols/sandbox b/repos/os/lib/symbols/sandbox index 0025452386..63e4b2658d 100644 --- a/repos/os/lib/symbols/sandbox +++ b/repos/os/lib/symbols/sandbox @@ -1,7 +1,7 @@ _ZN6Genode7Sandbox12apply_configERKNS_8Xml_nodeE T -_ZN6Genode7Sandbox18Local_service_base26_for_each_session_to_closeERNS1_8Close_fnE T -_ZN6Genode7Sandbox18Local_service_base26_for_each_upgraded_sessionERNS1_10Upgrade_fnE T -_ZN6Genode7Sandbox18Local_service_base27_for_each_requested_sessionERNS1_10Request_fnE T +_ZN6Genode7Sandbox18Local_service_base26_for_each_session_to_closeERKNS_8CallableINS1_14Close_responseEJRNS_7SessionEEE2FtE T +_ZN6Genode7Sandbox18Local_service_base26_for_each_upgraded_sessionERKNS_8CallableINS1_16Upgrade_responseEJRNS_7SessionERKNS4_9ResourcesEEE2FtE T +_ZN6Genode7Sandbox18Local_service_base27_for_each_requested_sessionERKNS_8CallableIvJRNS1_7RequestEEE2FtE T _ZN6Genode7Sandbox18Local_service_baseC1ERS0_RKNS_6StringILm32EEERNS1_6WakeupE T _ZN6Genode7Sandbox18Local_service_baseC2ERS0_RKNS_6StringILm32EEERNS1_6WakeupE T _ZN6Genode7SandboxC1ERNS_3EnvERNS0_13State_handlerE T diff --git a/repos/os/src/lib/sandbox/library.cc b/repos/os/src/lib/sandbox/library.cc index ba2379952f..06f863f680 100644 --- a/repos/os/src/lib/sandbox/library.cc +++ b/repos/os/src/lib/sandbox/library.cc @@ -521,7 +521,7 @@ void Genode::Sandbox::Library::apply_config(Xml_node const &config) ** Sandbox::Local_service_base ** *********************************/ -void Genode::Sandbox::Local_service_base::_for_each_requested_session(Request_fn &fn) +void Genode::Sandbox::Local_service_base::_for_each_requested_session(With_request::Ft const &fn) { _server_id_space.for_each([&] (Session_state &session) { @@ -529,7 +529,7 @@ void Genode::Sandbox::Local_service_base::_for_each_requested_session(Request_fn Request request(session); - fn.with_requested_session(request); + fn(request); bool wakeup_client = false; @@ -552,7 +552,7 @@ void Genode::Sandbox::Local_service_base::_for_each_requested_session(Request_fn } -void Genode::Sandbox::Local_service_base::_for_each_upgraded_session(Upgrade_fn &fn) +void Genode::Sandbox::Local_service_base::_for_each_upgraded_session(With_upgrade::Ft const &fn) { _server_id_space.for_each([&] (Session_state &session) { @@ -567,7 +567,7 @@ void Genode::Sandbox::Local_service_base::_for_each_upgraded_session(Upgrade_fn Session::Resources const amount { session.ram_upgrade, session.cap_upgrade }; - switch (fn.with_upgraded_session(*session.local_ptr, amount)) { + switch (fn(*session.local_ptr, amount)) { case Upgrade_response::CONFIRMED: session.phase = Session_state::CAP_HANDED_OUT; @@ -584,7 +584,7 @@ void Genode::Sandbox::Local_service_base::_for_each_upgraded_session(Upgrade_fn } -void Genode::Sandbox::Local_service_base::_for_each_session_to_close(Close_fn &close_fn) +void Genode::Sandbox::Local_service_base::_for_each_session_to_close(With_close::Ft const &fn) { /* * Collection of closed sessions to be destructed via callback @@ -606,7 +606,7 @@ void Genode::Sandbox::Local_service_base::_for_each_session_to_close(Close_fn &c if (session.local_ptr == nullptr) return; - switch (close_fn.close_session(*session.local_ptr)) { + switch (fn(*session.local_ptr)) { case Close_response::CLOSED: