From c4c19f885fd6b0992405cf57d15ab5d1e722fbfe Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Fri, 15 Feb 2019 14:39:27 +0100 Subject: [PATCH] base: synchronize signal-proxy thread destruction --- repos/base/include/base/entrypoint.h | 9 +++++---- repos/base/lib/symbols/ld | 2 ++ repos/base/src/lib/base/entrypoint.cc | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/repos/base/include/base/entrypoint.h b/repos/base/include/base/entrypoint.h index f2d132540..492633bd9 100644 --- a/repos/base/include/base/entrypoint.h +++ b/repos/base/include/base/entrypoint.h @@ -122,6 +122,10 @@ class Genode::Entrypoint : Noncopyable bool _wait_and_dispatch_one_io_signal(bool dont_block); Constructible _signal_proxy_thread { }; + bool _stop_signal_proxy { false }; + + void _handle_stop_signal_proxy() { _stop_signal_proxy = true; } + Constructible> _stop_signal_proxy_handler { }; friend class Startup; @@ -141,10 +145,7 @@ class Genode::Entrypoint : Noncopyable Entrypoint(Env &env, size_t stack_size, char const *name, Affinity::Location); - ~Entrypoint() - { - _rpc_ep->dissolve(&_signal_proxy); - } + ~Entrypoint(); /** * Associate RPC object with the entry point diff --git a/repos/base/lib/symbols/ld b/repos/base/lib/symbols/ld index 70d126772..7d835345a 100644 --- a/repos/base/lib/symbols/ld +++ b/repos/base/lib/symbols/ld @@ -66,6 +66,8 @@ _ZN6Genode10EntrypointC1ERNS_3EnvE T _ZN6Genode10EntrypointC1ERNS_3EnvEmPKc T _ZN6Genode10EntrypointC1ERNS_3EnvEmPKcNS_8Affinity8LocationE T _ZN6Genode10EntrypointC2ERNS_3EnvEmPKcNS_8Affinity8LocationE T +_ZN6Genode10EntrypointD1Ev T +_ZN6Genode10EntrypointD2Ev T _ZN6Genode10Ipc_serverC1Ev T _ZN6Genode10Ipc_serverC2Ev T _ZN6Genode10Ipc_serverD1Ev T diff --git a/repos/base/src/lib/base/entrypoint.cc b/repos/base/src/lib/base/entrypoint.cc index 426731107..09167c333 100644 --- a/repos/base/src/lib/base/entrypoint.cc +++ b/repos/base/src/lib/base/entrypoint.cc @@ -135,6 +135,11 @@ void Entrypoint::_process_incoming_signals() */ _signal_pending_ack_lock.lock(); } + + /* entrypoint destructor requested to stop signal handling */ + if (_stop_signal_proxy) { + return; + } } while (!_suspended); _deferred_signal_handler.destruct(); @@ -333,6 +338,7 @@ Entrypoint::Entrypoint(Env &env) _process_incoming_signals(); } + Entrypoint::Entrypoint(Env &env, size_t stack_size, char const *name, Affinity::Location location) : @@ -344,3 +350,14 @@ Entrypoint::Entrypoint(Env &env, size_t stack_size, char const *name, Thread::Weight(), env.cpu()); } +Entrypoint::~Entrypoint() +{ + /* stop the signal proxy before destruction */ + _stop_signal_proxy_handler.construct( + *this, *this, &Entrypoint::_handle_stop_signal_proxy); + Signal_transmitter(*_stop_signal_proxy_handler).submit(); + _signal_proxy_thread->join(); + _stop_signal_proxy_handler.destruct(); + + _rpc_ep->dissolve(&_signal_proxy); +}