From 9730c7e33396c1bce8d168b2a730f34351c09467 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Wed, 4 Nov 2015 14:21:57 +0100 Subject: [PATCH] base-nova: cleanup specific Rm_session_client - Align implementation to the current generic implementation - Document NOVA-specific implementation of dataspace() (as in the original commit message) --- repos/base-nova/include/rm_session/client.h | 75 ++++++++++++--------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/repos/base-nova/include/rm_session/client.h b/repos/base-nova/include/rm_session/client.h index c33d39da0..22cd240cf 100644 --- a/repos/base-nova/include/rm_session/client.h +++ b/repos/base-nova/include/rm_session/client.h @@ -18,46 +18,55 @@ #include #include -namespace Genode { +namespace Genode { struct Rm_session_client; } - struct Rm_session_client : Rpc_client + +struct Genode::Rm_session_client : Rpc_client +{ + /* + * Multiple calls to get the dataspace capability on NOVA lead to the + * situation that the caller gets each time a new mapping of the same + * capability at different indexes. But the client/caller assumes to get + * every time the very same index, e.g. in Noux the index is used to look + * up data structures attached to the capability. Therefore, we cache the + * dataspace capability on the first request. + */ + Dataspace_capability _rm_ds_cap; + + explicit Rm_session_client(Rm_session_capability session) + : Rpc_client(session) { } + + Local_addr attach(Dataspace_capability ds, size_t size = 0, + off_t offset = 0, bool use_local_addr = false, + Local_addr local_addr = (void *)0, + bool executable = false) override { - Dataspace_capability _rm_ds_cap; + return call(ds, size, offset, + use_local_addr, local_addr, + executable); + } - explicit Rm_session_client(Rm_session_capability session) - : Rpc_client(session) { } + void detach(Local_addr local_addr) override { + call(local_addr); } - Local_addr attach(Dataspace_capability ds, size_t size = 0, - off_t offset = 0, bool use_local_addr = false, - Local_addr local_addr = (void *)0, - bool executable = false) - { - return call(ds, size, offset, - use_local_addr, local_addr, - executable); - } + Pager_capability add_client(Thread_capability thread) override { + return call(thread); } - void detach(Local_addr local_addr) { - call(local_addr); } + void remove_client(Pager_capability pager) override { + call(pager); } - Pager_capability add_client(Thread_capability thread) { - return call(thread); } + void fault_handler(Signal_context_capability handler) override { + call(handler); } - void remove_client(Pager_capability pager) { - call(pager); } + State state() override { + return call(); } - void fault_handler(Signal_context_capability handler) { - call(handler); } - - State state() { - return call(); } - - Dataspace_capability dataspace() { - if (!_rm_ds_cap.valid()) - _rm_ds_cap = call(); - return _rm_ds_cap; - } - }; -} + Dataspace_capability dataspace() override + { + if (!_rm_ds_cap.valid()) + _rm_ds_cap = call(); + return _rm_ds_cap; + } +}; #endif /* _INCLUDE__RM_SESSION__CLIENT_H_ */