From b134867f3101305a178931ec5c4dbf664d2d83fa Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 21 Apr 2020 16:41:13 +0200 Subject: [PATCH] Remove Rpc_entrypoint::Native_context This patch largely reverts the commit "base: lay groundwork for base-linux caps change" because the use of 'epoll' instead of 'select' alleviated the need to allocate large FD sets, which motivated the introduction of the 'Native_context' hook. Related to issue #3581 --- .../base-fiasco/lib/mk/base-fiasco-common.mk | 2 - repos/base-fiasco/src/lib/base/ipc.cc | 14 +++--- repos/base-foc/lib/mk/base-foc-common.inc | 2 - repos/base-foc/src/lib/base/ipc.cc | 14 +++--- repos/base-hw/lib/mk/base-hw-common.mk | 2 - repos/base-hw/src/lib/base/ipc.cc | 14 +++--- repos/base-linux/lib/mk/base-linux-common.mk | 2 - repos/base-linux/src/lib/base/ipc.cc | 13 +++--- repos/base-okl4/lib/mk/base-okl4-common.mk | 2 - repos/base-okl4/src/lib/base/ipc.cc | 14 +++--- .../lib/mk/base-pistachio-common.mk | 2 - repos/base-pistachio/src/lib/base/ipc.cc | 14 +++--- repos/base-sel4/lib/mk/base-sel4-common.inc | 2 - repos/base-sel4/src/lib/base/ipc.cc | 14 +++--- repos/base/include/base/rpc_server.h | 22 +-------- .../src/include/base/internal/ipc_server.h | 23 +++------- repos/base/src/lib/base/rpc_dispatch_loop.cc | 32 ++++++++++--- repos/base/src/lib/base/rpc_entry.cc | 40 ----------------- repos/base/src/lib/base/rpc_entrypoint.cc | 2 +- .../src/lib/base/rpc_entrypoint_manage.cc | 45 ------------------- 20 files changed, 78 insertions(+), 197 deletions(-) delete mode 100644 repos/base/src/lib/base/rpc_entry.cc delete mode 100644 repos/base/src/lib/base/rpc_entrypoint_manage.cc diff --git a/repos/base-fiasco/lib/mk/base-fiasco-common.mk b/repos/base-fiasco/lib/mk/base-fiasco-common.mk index 4880c8634..851758c6f 100644 --- a/repos/base-fiasco/lib/mk/base-fiasco-common.mk +++ b/repos/base-fiasco/lib/mk/base-fiasco-common.mk @@ -10,7 +10,5 @@ LIBS += startup-fiasco syscall-fiasco SRC_CC += capability.cc capability_raw.cc SRC_CC += rpc_dispatch_loop.cc -SRC_CC += rpc_entrypoint_manage.cc SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc SRC_CC += stack_area_addr.cc -SRC_CC += rpc_entry.cc diff --git a/repos/base-fiasco/src/lib/base/ipc.cc b/repos/base-fiasco/src/lib/base/ipc.cc index b560bbee6..68e326025 100644 --- a/repos/base-fiasco/src/lib/base/ipc.cc +++ b/repos/base-fiasco/src/lib/base/ipc.cc @@ -204,11 +204,10 @@ void Genode::ipc_reply(Native_capability caller, Rpc_exception_code exc, } -Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, - Rpc_exception_code exc, - Msgbuf_base &reply_msg, - Msgbuf_base &request_msg, - Rpc_entrypoint::Native_context &) +Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, + Rpc_exception_code exc, + Msgbuf_base &reply_msg, + Msgbuf_base &request_msg) { using namespace Fiasco; @@ -275,10 +274,9 @@ Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_ } -Ipc_server::Ipc_server(Rpc_entrypoint::Native_context& native_context) +Ipc_server::Ipc_server() : - Native_capability(Capability_space::import(Fiasco::l4_myself(), Rpc_obj_key())), - _native_context(native_context) + Native_capability(Capability_space::import(Fiasco::l4_myself(), Rpc_obj_key())) { } diff --git a/repos/base-foc/lib/mk/base-foc-common.inc b/repos/base-foc/lib/mk/base-foc-common.inc index 585b78fb6..f40551ea6 100644 --- a/repos/base-foc/lib/mk/base-foc-common.inc +++ b/repos/base-foc/lib/mk/base-foc-common.inc @@ -10,9 +10,7 @@ LIBS += syscall-foc startup-foc SRC_CC += spin_lock.cc cap_map.cc SRC_CC += rpc_dispatch_loop.cc -SRC_CC += rpc_entrypoint_manage.cc SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc utcb.cc SRC_CC += capability.cc SRC_CC += signal_source_client.cc SRC_CC += platform.cc -SRC_CC += rpc_entry.cc diff --git a/repos/base-foc/src/lib/base/ipc.cc b/repos/base-foc/src/lib/base/ipc.cc index 61f963cb6..7b26adbdd 100644 --- a/repos/base-foc/src/lib/base/ipc.cc +++ b/repos/base-foc/src/lib/base/ipc.cc @@ -316,11 +316,10 @@ void Genode::ipc_reply(Native_capability, Rpc_exception_code exc, } -Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, - Rpc_exception_code exc, - Msgbuf_base &reply_msg, - Msgbuf_base &request_msg, - Rpc_entrypoint::Native_context &) +Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, + Rpc_exception_code exc, + Msgbuf_base &reply_msg, + Msgbuf_base &request_msg) { Receive_window &rcv_window = Thread::myself()->native_thread().rcv_window; @@ -371,10 +370,9 @@ Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, } -Ipc_server::Ipc_server(Rpc_entrypoint::Native_context& native_context) +Ipc_server::Ipc_server() : - Native_capability((Cap_index*)Fiasco::l4_utcb_tcr()->user[Fiasco::UTCB_TCR_BADGE]), - _native_context(native_context) + Native_capability((Cap_index*)Fiasco::l4_utcb_tcr()->user[Fiasco::UTCB_TCR_BADGE]) { Thread::myself()->native_thread().rcv_window.init(); } diff --git a/repos/base-hw/lib/mk/base-hw-common.mk b/repos/base-hw/lib/mk/base-hw-common.mk index e7173da7d..d839caf3d 100644 --- a/repos/base-hw/lib/mk/base-hw-common.mk +++ b/repos/base-hw/lib/mk/base-hw-common.mk @@ -10,7 +10,5 @@ include $(BASE_DIR)/lib/mk/base-common.inc LIBS += syscall-hw SRC_CC += rpc_dispatch_loop.cc -SRC_CC += rpc_entrypoint_manage.cc SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc SRC_CC += signal_transmitter.cc -SRC_CC += rpc_entry.cc diff --git a/repos/base-hw/src/lib/base/ipc.cc b/repos/base-hw/src/lib/base/ipc.cc index deff808b6..29a9478bb 100644 --- a/repos/base-hw/src/lib/base/ipc.cc +++ b/repos/base-hw/src/lib/base/ipc.cc @@ -130,11 +130,10 @@ void Genode::ipc_reply(Native_capability, Rpc_exception_code exc, } -Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, - Rpc_exception_code exc, - Msgbuf_base &reply_msg, - Msgbuf_base &request_msg, - Rpc_entrypoint::Native_context &) +Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, + Rpc_exception_code exc, + Msgbuf_base &reply_msg, + Msgbuf_base &request_msg) { Native_utcb &utcb = *Thread::myself()->utcb(); @@ -163,11 +162,10 @@ Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, } -Ipc_server::Ipc_server(Rpc_entrypoint::Native_context& _native_context) +Ipc_server::Ipc_server() : Native_capability(Thread::myself() ? Thread::myself()->native_thread().cap - : Hw::_main_thread_cap), - _native_context(_native_context) + : Hw::_main_thread_cap) { } diff --git a/repos/base-linux/lib/mk/base-linux-common.mk b/repos/base-linux/lib/mk/base-linux-common.mk index 2a84b880c..918cf7e76 100644 --- a/repos/base-linux/lib/mk/base-linux-common.mk +++ b/repos/base-linux/lib/mk/base-linux-common.mk @@ -10,8 +10,6 @@ LIBS += syscall-linux SRC_CC += region_map_mmap.cc debug.cc SRC_CC += rpc_dispatch_loop.cc -SRC_CC += rpc_entrypoint_manage.cc SRC_CC += thread_env.cc SRC_CC += capability.cc -SRC_CC += rpc_entry.cc SRC_CC += native_thread.cc diff --git a/repos/base-linux/src/lib/base/ipc.cc b/repos/base-linux/src/lib/base/ipc.cc index 6999cc961..1e43611e1 100644 --- a/repos/base-linux/src/lib/base/ipc.cc +++ b/repos/base-linux/src/lib/base/ipc.cc @@ -370,11 +370,10 @@ void Genode::ipc_reply(Native_capability caller, Rpc_exception_code exc, } -Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, - Rpc_exception_code exc, - Msgbuf_base &reply_msg, - Msgbuf_base &request_msg, - Rpc_entrypoint::Native_context &) +Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, + Rpc_exception_code exc, + Msgbuf_base &reply_msg, + Msgbuf_base &request_msg) { /* when first called, there was no request yet */ if (last_caller.valid() && exc.value != Rpc_exception_code::INVALID_OBJECT) @@ -423,9 +422,7 @@ Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, } -Ipc_server::Ipc_server(Rpc_entrypoint::Native_context& native_context) -: - _native_context(native_context) +Ipc_server::Ipc_server() { /* * If 'thread' is 0, the constructor was called by the main thread. By diff --git a/repos/base-okl4/lib/mk/base-okl4-common.mk b/repos/base-okl4/lib/mk/base-okl4-common.mk index 621f72701..fcde126c9 100644 --- a/repos/base-okl4/lib/mk/base-okl4-common.mk +++ b/repos/base-okl4/lib/mk/base-okl4-common.mk @@ -10,7 +10,5 @@ LIBS += startup-okl4 syscall-okl4 SRC_CC += capability.cc capability_raw.cc SRC_CC += rpc_dispatch_loop.cc -SRC_CC += rpc_entrypoint_manage.cc SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc SRC_CC += stack_area_addr.cc -SRC_CC += rpc_entry.cc diff --git a/repos/base-okl4/src/lib/base/ipc.cc b/repos/base-okl4/src/lib/base/ipc.cc index 1f50bb411..0e2798978 100644 --- a/repos/base-okl4/src/lib/base/ipc.cc +++ b/repos/base-okl4/src/lib/base/ipc.cc @@ -195,11 +195,10 @@ void Genode::ipc_reply(Native_capability caller, Rpc_exception_code exc, } -Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, - Rpc_exception_code exc, - Msgbuf_base &reply_msg, - Msgbuf_base &request_msg, - Rpc_entrypoint::Native_context &) +Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, + Rpc_exception_code exc, + Msgbuf_base &reply_msg, + Msgbuf_base &request_msg) { L4_MsgTag_t rcv_tag; @@ -238,10 +237,9 @@ static inline Okl4::L4_ThreadId_t thread_get_my_global_id() } -Ipc_server::Ipc_server(Rpc_entrypoint::Native_context& _native_context) +Ipc_server::Ipc_server() : - Native_capability(Capability_space::import(thread_get_my_global_id(), Rpc_obj_key())), - _native_context(_native_context) + Native_capability(Capability_space::import(thread_get_my_global_id(), Rpc_obj_key())) { } diff --git a/repos/base-pistachio/lib/mk/base-pistachio-common.mk b/repos/base-pistachio/lib/mk/base-pistachio-common.mk index dce3d8b23..3ec2a587f 100644 --- a/repos/base-pistachio/lib/mk/base-pistachio-common.mk +++ b/repos/base-pistachio/lib/mk/base-pistachio-common.mk @@ -10,10 +10,8 @@ LIBS += startup-pistachio syscall-pistachio SRC_CC += capability.cc capability_raw.cc SRC_CC += rpc_dispatch_loop.cc -SRC_CC += rpc_entrypoint_manage.cc SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc SRC_CC += stack_area_addr.cc -SRC_CC += rpc_entry.cc # suppress warning caused by Pistachio's 'l4/message.h' CC_WARN += -Wno-array-bounds diff --git a/repos/base-pistachio/src/lib/base/ipc.cc b/repos/base-pistachio/src/lib/base/ipc.cc index 9e10170bf..e8c58d093 100644 --- a/repos/base-pistachio/src/lib/base/ipc.cc +++ b/repos/base-pistachio/src/lib/base/ipc.cc @@ -185,11 +185,10 @@ void Genode::ipc_reply(Native_capability caller, Rpc_exception_code exc, } -Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, - Rpc_exception_code exc, - Msgbuf_base &reply_msg, - Msgbuf_base &request_msg, - Rpc_entrypoint::Native_context &) +Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, + Rpc_exception_code exc, + Msgbuf_base &reply_msg, + Msgbuf_base &request_msg) { bool need_to_wait = true; @@ -238,10 +237,9 @@ Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_ } -Ipc_server::Ipc_server(Rpc_entrypoint::Native_context& _native_context) +Ipc_server::Ipc_server() : - Native_capability(Capability_space::import(Pistachio::L4_Myself(), Rpc_obj_key())), - _native_context(_native_context) + Native_capability(Capability_space::import(Pistachio::L4_Myself(), Rpc_obj_key())) { } diff --git a/repos/base-sel4/lib/mk/base-sel4-common.inc b/repos/base-sel4/lib/mk/base-sel4-common.inc index af705b0f5..70171a9b4 100644 --- a/repos/base-sel4/lib/mk/base-sel4-common.inc +++ b/repos/base-sel4/lib/mk/base-sel4-common.inc @@ -9,9 +9,7 @@ include $(BASE_DIR)/lib/mk/base-common.inc LIBS += startup-sel4 syscall-sel4 SRC_CC += rpc_dispatch_loop.cc -SRC_CC += rpc_entrypoint_manage.cc SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc SRC_CC += capability.cc capability_raw.cc SRC_CC += stack_area_addr.cc SRC_CC += platform.cc -SRC_CC += rpc_entry.cc diff --git a/repos/base-sel4/src/lib/base/ipc.cc b/repos/base-sel4/src/lib/base/ipc.cc index eed50c848..1e9f02107 100644 --- a/repos/base-sel4/src/lib/base/ipc.cc +++ b/repos/base-sel4/src/lib/base/ipc.cc @@ -359,11 +359,10 @@ void Genode::ipc_reply(Native_capability, Rpc_exception_code exc, } -Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, - Rpc_exception_code exc, - Msgbuf_base &reply_msg, - Msgbuf_base &request_msg, - Rpc_entrypoint::Native_context &) +Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, + Rpc_exception_code exc, + Msgbuf_base &reply_msg, + Msgbuf_base &request_msg) { /* allocate and define receive selector */ if (!rcv_sel()) @@ -392,10 +391,9 @@ Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &, } -Ipc_server::Ipc_server(Rpc_entrypoint::Native_context& _native_context) +Ipc_server::Ipc_server() : - Native_capability(Capability_space::create_ep_cap(*Thread::myself())), - _native_context(_native_context) + Native_capability(Capability_space::create_ep_cap(*Thread::myself())) { } diff --git a/repos/base/include/base/rpc_server.h b/repos/base/include/base/rpc_server.h index 1b5a170e7..cc48bb4f8 100644 --- a/repos/base/include/base/rpc_server.h +++ b/repos/base/include/base/rpc_server.h @@ -1,13 +1,11 @@ /* * \brief Server-side API of the RPC framework * \author Norman Feske - * \author Stefan Thöni * \date 2006-04-28 */ /* - * Copyright (C) 2006-2020 Genode Labs GmbH - * Copyright (C) 2020 gapfruit AG + * Copyright (C) 2006-2017 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU Affero General Public License version 3. @@ -280,6 +278,7 @@ struct Genode::Rpc_object : Rpc_object_base, Rpc_dispatcher */ friend class Signal_receiver; - public: - - class Native_context; - private: /** @@ -325,8 +320,6 @@ class Genode::Rpc_entrypoint : Thread, public Object_pool */ static void _activation_entry(); - static size_t _native_stack_size(size_t stack_size); - struct Exit : Genode::Interface { GENODE_RPC(Rpc_exit, void, _exit); @@ -351,7 +344,6 @@ class Genode::Rpc_entrypoint : Thread, public Object_pool Pd_session &_pd_session; /* for creating capabilities */ Exit_handler _exit_handler { }; Capability _exit_cap { }; - Native_context *_native_context { nullptr }; /** * Access to kernel-specific part of the PD session interface @@ -407,12 +399,6 @@ class Genode::Rpc_entrypoint : Thread, public Object_pool */ void entry() override; - /** - * Called by implementation specific entry function - * with created native context - */ - void _entry(Native_context& native_context); - public: /** @@ -429,12 +415,8 @@ class Genode::Rpc_entrypoint : Thread, public Object_pool char const *name, bool start_on_construction = true, Affinity::Location location = Affinity::Location()); - Rpc_entrypoint(Genode::Rpc_entrypoint const &) = delete; - ~Rpc_entrypoint(); - Genode::Rpc_entrypoint operator=(Genode::Rpc_entrypoint const &) = delete; - /** * Associate RPC object with the entry point */ diff --git a/repos/base/src/include/base/internal/ipc_server.h b/repos/base/src/include/base/internal/ipc_server.h index c8a0d8295..08a74c2df 100644 --- a/repos/base/src/include/base/internal/ipc_server.h +++ b/repos/base/src/include/base/internal/ipc_server.h @@ -17,7 +17,6 @@ /* Genode includes */ #include #include -#include namespace Genode { @@ -45,25 +44,17 @@ namespace Genode { /** * Send result of previous RPC request and wait for new one */ - Rpc_request ipc_reply_wait(Reply_capability const &caller, - Rpc_exception_code reply_exc, - Msgbuf_base &reply_msg, - Msgbuf_base &request_msg, - Rpc_entrypoint::Native_context &native_context); + Rpc_request ipc_reply_wait(Reply_capability const &caller, + Rpc_exception_code reply_exc, + Msgbuf_base &reply_msg, + Msgbuf_base &request_msg); } -class Genode::Ipc_server : public Native_capability +struct Genode::Ipc_server : Native_capability { - private: - - Rpc_entrypoint::Native_context& _native_context; - - public: - - Ipc_server(Rpc_entrypoint::Native_context& native_context); - - ~Ipc_server(); + Ipc_server(); + ~Ipc_server(); }; #endif /* _INCLUDE__BASE__INTERNAL__IPC_SERVER_H_ */ diff --git a/repos/base/src/lib/base/rpc_dispatch_loop.cc b/repos/base/src/lib/base/rpc_dispatch_loop.cc index 3b282cb85..52669d2fe 100644 --- a/repos/base/src/lib/base/rpc_dispatch_loop.cc +++ b/repos/base/src/lib/base/rpc_dispatch_loop.cc @@ -20,11 +20,33 @@ using namespace Genode; -void Rpc_entrypoint::_entry(Native_context& native_context) -{ - _native_context = &native_context; - Ipc_server srv(native_context); +/*********************** + ** Server entrypoint ** + ***********************/ + +Untyped_capability Rpc_entrypoint::_manage(Rpc_object_base *obj) +{ + /* don't manage RPC object twice */ + if (obj->cap().valid()) { + warning("attempt to manage RPC object twice"); + return obj->cap(); + } + + Untyped_capability new_obj_cap = _alloc_rpc_cap(_pd_session, _cap); + + /* add server object to object pool */ + obj->cap(new_obj_cap); + insert(obj); + + /* return capability that uses the object id as badge */ + return new_obj_cap; +} + + +void Rpc_entrypoint::entry() +{ + Ipc_server srv; _cap = srv; _cap_valid.wakeup(); @@ -41,7 +63,7 @@ void Rpc_entrypoint::_entry(Native_context& native_context) while (!_exit_handler.exit) { - Rpc_request const request = ipc_reply_wait(_caller, exc, _snd_buf, _rcv_buf, native_context); + Rpc_request const request = ipc_reply_wait(_caller, exc, _snd_buf, _rcv_buf); _caller = request.caller; Ipc_unmarshaller unmarshaller(_rcv_buf); diff --git a/repos/base/src/lib/base/rpc_entry.cc b/repos/base/src/lib/base/rpc_entry.cc deleted file mode 100644 index 1c30363da..000000000 --- a/repos/base/src/lib/base/rpc_entry.cc +++ /dev/null @@ -1,40 +0,0 @@ -/* - * \brief Default version of platform-specific part of RPC framework - * \author Stefan Thöni - * \date 2020-01-30 - */ - -/* - * Copyright (C) 2006-2020 Genode Labs GmbH - * Copyright (C) 2020 gapfruit AG - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -/* Genode includes */ -#include - -/* base-internal includes */ -#include - -using namespace Genode; - - -class Rpc_entrypoint::Native_context -{ -}; - - -void Rpc_entrypoint::entry() -{ - Native_context context { }; - _entry(context); -} - - -size_t Rpc_entrypoint::_native_stack_size(size_t stack_size) -{ - return stack_size + sizeof(Native_context); -} - diff --git a/repos/base/src/lib/base/rpc_entrypoint.cc b/repos/base/src/lib/base/rpc_entrypoint.cc index 64164f338..3ffd8a268 100644 --- a/repos/base/src/lib/base/rpc_entrypoint.cc +++ b/repos/base/src/lib/base/rpc_entrypoint.cc @@ -73,7 +73,7 @@ Rpc_entrypoint::Rpc_entrypoint(Pd_session *pd_session, size_t stack_size, char const *name, bool start_on_construction, Affinity::Location location) : - Thread(Cpu_session::Weight::DEFAULT_WEIGHT, name, _native_stack_size(stack_size), location), + Thread(Cpu_session::Weight::DEFAULT_WEIGHT, name, stack_size, location), _cap(Untyped_capability()), _pd_session(*pd_session) { diff --git a/repos/base/src/lib/base/rpc_entrypoint_manage.cc b/repos/base/src/lib/base/rpc_entrypoint_manage.cc deleted file mode 100644 index 4bf140d82..000000000 --- a/repos/base/src/lib/base/rpc_entrypoint_manage.cc +++ /dev/null @@ -1,45 +0,0 @@ -/* - * \brief Default version of platform-specific part of RPC framework - * \author Norman Feske - * \date 2006-05-12 - */ - -/* - * Copyright (C) 2006-2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -/* Genode includes */ -#include -#include - -/* base-internal includes */ -#include - -using namespace Genode; - - -/*********************** - ** Server entrypoint ** - ***********************/ - -Untyped_capability Rpc_entrypoint::_manage(Rpc_object_base *obj) -{ - /* don't manage RPC object twice */ - if (obj->cap().valid()) { - warning("attempt to manage RPC object twice"); - return obj->cap(); - } - - Untyped_capability new_obj_cap = _alloc_rpc_cap(_pd_session, _cap); - - /* add server object to object pool */ - obj->cap(new_obj_cap); - insert(obj); - - /* return capability that uses the object id as badge */ - return new_obj_cap; -} -