From 65291902e0fff7d6f1b2b54c56cb81f88e5bf570 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Fri, 10 Jan 2014 11:42:31 +0100 Subject: [PATCH] os: manage/dissolve Signal_rpc_member in class Instead of, passing responsibility to manage and dissolve Signal_rpc_member objects at a corresponding entrypoint to the user, hand over entrypoint's reference to the constructor, and do it in the constructor resp. destructor of the class. Fixes #1022 --- os/include/os/signal_rpc_dispatcher.h | 24 ++++++++++++++++++------ os/src/server/lx_fs/main.cc | 9 +++------ os/src/server/nitpicker/main.cc | 12 +++++------- os/src/server/ram_fs/main.cc | 9 +++------ 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/os/include/os/signal_rpc_dispatcher.h b/os/include/os/signal_rpc_dispatcher.h index 8393b45dfd..c64936c84d 100644 --- a/os/include/os/signal_rpc_dispatcher.h +++ b/os/include/os/signal_rpc_dispatcher.h @@ -21,7 +21,7 @@ namespace Genode { class Signal_rpc_dispatcher_base; template class Signal_rpc_functor; - template class Signal_rpc_member; + template class Signal_rpc_member; template Signal_rpc_functor signal_rpc_functor(FUNCTOR &); @@ -148,6 +148,11 @@ struct Genode::Signal_rpc_functor : Genode::Signal_rpc_dispatcher_base }; +namespace Server{ + class Entrypoint; +} + + /** * Signal dispatcher for directing signals via RPC to member function * @@ -159,21 +164,28 @@ struct Genode::Signal_rpc_functor : Genode::Signal_rpc_dispatcher_base * 'Signal_dispatcher_base::dispatch'. * * \param T type of signal-handling class + * \param EP type of entrypoint handling signal RPC */ -template -struct Genode::Signal_rpc_member : Genode::Signal_rpc_dispatcher_base +template +struct Genode::Signal_rpc_member : Genode::Signal_rpc_dispatcher_base, + Genode::Signal_context_capability { - T &obj; + EP &ep; + T &obj; void (T::*member) (unsigned); /** * Constructor * + * \param ep entrypoint managing this signal RPC * \param obj,member object and member function to call when * the signal occurs */ - Signal_rpc_member(T &obj, void (T::*member)(unsigned)) - : obj(obj), member(member) { } + Signal_rpc_member(EP &ep, T &obj, void (T::*member)(unsigned)) + : Signal_context_capability(ep.manage(*this)), + ep(ep), obj(obj), member(member) { } + + ~Signal_rpc_member() { ep.dissolve(*this); } /** * Interface of Signal_rpc_dispatcher_base diff --git a/os/src/server/lx_fs/main.cc b/os/src/server/lx_fs/main.cc index 16d827256c..0ad7fd8d59 100644 --- a/os/src/server/lx_fs/main.cc +++ b/os/src/server/lx_fs/main.cc @@ -160,16 +160,14 @@ class File_system::Session_component : public Session_rpc_object _md_alloc(md_alloc), _root(*new (&_md_alloc) Directory(_md_alloc, root_dir, false)), _writable(writable), - _process_packet_dispatcher(*this, &Session_component::_process_packets) + _process_packet_dispatcher(ep, *this, &Session_component::_process_packets) { /* * Register '_process_packets' dispatch function as signal * handler for packet-avail and ready-to-ack signals. */ - Signal_context_capability sigh(_ep.manage(_process_packet_dispatcher)); - - _tx.sigh_packet_avail(sigh); - _tx.sigh_ready_to_ack(sigh); + _tx.sigh_packet_avail(_process_packet_dispatcher); + _tx.sigh_ready_to_ack(_process_packet_dispatcher); } /** @@ -177,7 +175,6 @@ class File_system::Session_component : public Session_rpc_object */ ~Session_component() { - _ep.dissolve(_process_packet_dispatcher); Dataspace_capability ds = tx_sink()->dataspace(); env()->ram_session()->free(static_cap_cast(ds)); destroy(&_md_alloc, &_root); diff --git a/os/src/server/nitpicker/main.cc b/os/src/server/nitpicker/main.cc index 31c287049d..427ece577f 100644 --- a/os/src/server/nitpicker/main.cc +++ b/os/src/server/nitpicker/main.cc @@ -813,16 +813,14 @@ struct Nitpicker::Main */ void handle_config(unsigned); - Signal_rpc_member
config_dispatcher = { *this, &Main::handle_config }; - - Signal_context_capability config_sigh = ep.manage(config_dispatcher); + Signal_rpc_member
config_dispatcher = { ep, *this, &Main::handle_config}; /** * Signal handler invoked on the reception of user input */ void handle_input(unsigned); - Signal_rpc_member
input_dispatcher = { *this, &Main::handle_input }; + Signal_rpc_member
input_dispatcher = { ep, *this, &Main::handle_input }; /* * Dispatch input on periodic timer signals every 10 milliseconds @@ -838,10 +836,10 @@ struct Nitpicker::Main user_state.stack(menubar); user_state.stack(background); - config()->sigh(config_sigh); - Signal_transmitter(config_sigh).submit(); + config()->sigh(config_dispatcher); + Signal_transmitter(config_dispatcher).submit(); - timer.sigh(ep.manage(input_dispatcher)); + timer.sigh(input_dispatcher); timer.trigger_periodic(10*1000); env()->parent()->announce(ep.manage(np_root)); diff --git a/os/src/server/ram_fs/main.cc b/os/src/server/ram_fs/main.cc index 63a967a76f..d908846306 100644 --- a/os/src/server/ram_fs/main.cc +++ b/os/src/server/ram_fs/main.cc @@ -154,16 +154,14 @@ namespace File_system { _ep(ep), _root(root), _writable(writable), - _process_packet_dispatcher(*this, &Session_component::_process_packets) + _process_packet_dispatcher(ep, *this, &Session_component::_process_packets) { /* * Register '_process_packets' dispatch function as signal * handler for packet-avail and ready-to-ack signals. */ - Signal_context_capability sigh(_ep.manage(_process_packet_dispatcher)); - - _tx.sigh_packet_avail(sigh); - _tx.sigh_ready_to_ack(sigh); + _tx.sigh_packet_avail(_process_packet_dispatcher); + _tx.sigh_ready_to_ack(_process_packet_dispatcher); } /** @@ -171,7 +169,6 @@ namespace File_system { */ ~Session_component() { - _ep.dissolve(_process_packet_dispatcher); Dataspace_capability ds = tx_sink()->dataspace(); env()->ram_session()->free(static_cap_cast(ds)); }