diff --git a/repos/base-foc/src/include/signal_source/client.h b/repos/base-foc/src/include/signal_source/client.h
index 74f0fae808..27ec10b92d 100644
--- a/repos/base-foc/src/include/signal_source/client.h
+++ b/repos/base-foc/src/include/signal_source/client.h
@@ -25,6 +25,7 @@
#include
#include
+#include
#include
namespace Genode { class Signal_source_client; }
@@ -44,7 +45,7 @@ class Genode::Signal_source_client : public Rpc_client
/**
* Constructor
*/
- Signal_source_client(Capability cap);
+ Signal_source_client(Cpu_session &, Capability cap);
/**
* Destructor
diff --git a/repos/base-foc/src/lib/base/signal_source_client.cc b/repos/base-foc/src/lib/base/signal_source_client.cc
index 01f3592837..348cafd900 100644
--- a/repos/base-foc/src/lib/base/signal_source_client.cc
+++ b/repos/base-foc/src/lib/base/signal_source_client.cc
@@ -15,9 +15,6 @@
/* Genode includes */
#include
#include
-#include
-#include
-#include
/* base-internal includes */
#include
@@ -30,7 +27,7 @@
using namespace Genode;
-Signal_source_client::Signal_source_client(Capability cap)
+Signal_source_client::Signal_source_client(Cpu_session &cpu, Capability cap)
:
Rpc_client(static_cap_cast(cap)),
@@ -39,7 +36,7 @@ Signal_source_client::Signal_source_client(Capability cap)
{
using namespace Foc;
- Foc_native_cpu_client cpu_client(env_deprecated()->cpu_session()->native_cpu());
+ Foc_native_cpu_client cpu_client(cpu.native_cpu());
Native_capability thread_cap = cpu_client.native_cap(Thread::myself()->cap());
l4_msgtag_t tag = l4_rcv_ep_bind_thread(_sem.data()->kcap(), thread_cap.data()->kcap(), 0);
if (l4_error(tag))
diff --git a/repos/base-hw/src/lib/base/signal_receiver.cc b/repos/base-hw/src/lib/base/signal_receiver.cc
index a39bec0602..55c1e609a7 100644
--- a/repos/base-hw/src/lib/base/signal_receiver.cc
+++ b/repos/base-hw/src/lib/base/signal_receiver.cc
@@ -47,7 +47,10 @@ void Genode::init_signal_thread(Env &env) { _pd_ptr = &env.pd(); }
void Genode::destroy_signal_thread() { }
-Signal_receiver::Signal_receiver()
+void Genode::init_signal_receiver(Pd_session &, Parent &) { }
+
+
+Signal_receiver::Signal_receiver() : _pd(pd())
{
for (;;) {
diff --git a/repos/base-nova/src/include/signal_source/client.h b/repos/base-nova/src/include/signal_source/client.h
index 5a0159cbd6..ac64d000c8 100644
--- a/repos/base-nova/src/include/signal_source/client.h
+++ b/repos/base-nova/src/include/signal_source/client.h
@@ -23,6 +23,7 @@
/* Genode includes */
#include
+#include
#include
/* base-internal includes */
@@ -49,7 +50,7 @@ namespace Genode {
/**
* Constructor
*/
- Signal_source_client(Capability cap)
+ Signal_source_client(Cpu_session &, Capability cap)
: Rpc_client(static_cap_cast(cap))
{
/* request mapping of semaphore capability selector */
diff --git a/repos/base-sel4/src/include/signal_source/client.h b/repos/base-sel4/src/include/signal_source/client.h
index aed4ec5bbf..bb9c5c7143 100644
--- a/repos/base-sel4/src/include/signal_source/client.h
+++ b/repos/base-sel4/src/include/signal_source/client.h
@@ -18,6 +18,7 @@
#include
#include
#include
+#include
namespace Genode { class Signal_source_client; }
@@ -38,9 +39,12 @@ class Genode::Signal_source_client : public Rpc_client
/**
* Constructor
*/
- Signal_source_client(Capability cap)
- : Rpc_client(static_cap_cast(cap))
- { _init_notify(); }
+ Signal_source_client(Cpu_session &, Capability cap)
+ :
+ Rpc_client(static_cap_cast(cap))
+ {
+ _init_notify();
+ }
/*****************************
diff --git a/repos/base/include/base/signal.h b/repos/base/include/base/signal.h
index 4ee1e0085c..2668507617 100644
--- a/repos/base/include/base/signal.h
+++ b/repos/base/include/base/signal.h
@@ -30,6 +30,7 @@ namespace Genode {
class Entrypoint;
class Rpc_entrypoint;
+ class Pd_session;
class Signal_source;
class Signal_receiver;
@@ -314,6 +315,8 @@ class Genode::Signal_receiver : Noncopyable
}
};
+ Pd_session &_pd;
+
/**
* Semaphore used to indicate that signal(s) are ready to be picked
* up. This is needed for platforms other than 'base-hw' only.
diff --git a/repos/base/src/core/signal_receiver.cc b/repos/base/src/core/signal_receiver.cc
index c3fb1c6e29..c332eab62f 100644
--- a/repos/base/src/core/signal_receiver.cc
+++ b/repos/base/src/core/signal_receiver.cc
@@ -28,18 +28,33 @@
using namespace Core;
-Signal_receiver::Signal_receiver() { }
+static Pd_session *_pd_ptr;
+
+
+Signal_receiver::Signal_receiver() : _pd(*_pd_ptr)
+{
+ if (!_pd_ptr) {
+ struct Missing_call_of_init_signal_receiver { };
+ for(;;);
+ throw Missing_call_of_init_signal_receiver();
+ }
+}
+
void Signal_receiver::_platform_destructor() { }
void Signal_receiver::_platform_begin_dissolve (Signal_context *) { }
void Signal_receiver::_platform_finish_dissolve(Signal_context *) { }
+
void Signal_receiver::unblock_signal_waiter(Rpc_entrypoint &) { ASSERT_NEVER_CALLED; }
+
typedef Signal_context_capability Sigh_cap;
+
Sigh_cap Signal_receiver::manage(Signal_context *) { ASSERT_NEVER_CALLED; }
+
void Signal_receiver::block_for_signal()
{
/*
@@ -51,7 +66,12 @@ void Signal_receiver::block_for_signal()
sleep_forever();
}
+
Signal Signal_receiver::pending_signal() {
return Signal(); }
+
void Signal_receiver::local_submit(Signal::Data) { ASSERT_NEVER_CALLED; }
+
+
+void Genode::init_signal_receiver(Pd_session &pd, Parent &) { _pd_ptr = &pd; }
diff --git a/repos/base/src/include/base/internal/globals.h b/repos/base/src/include/base/internal/globals.h
index daf36eaebc..c28ac27291 100644
--- a/repos/base/src/include/base/internal/globals.h
+++ b/repos/base/src/include/base/internal/globals.h
@@ -30,6 +30,7 @@ namespace Genode {
void init_stack_area();
void init_exception_handling(Env &);
void init_signal_transmitter(Env &);
+ void init_signal_receiver(Pd_session &, Parent &);
void init_cxx_heap(Env &);
void init_cxx_guard();
void init_ldso_phdr(Env &);
diff --git a/repos/base/src/include/signal_source/client.h b/repos/base/src/include/signal_source/client.h
index 42f5f9672f..949b396adf 100644
--- a/repos/base/src/include/signal_source/client.h
+++ b/repos/base/src/include/signal_source/client.h
@@ -16,13 +16,14 @@
#include
#include
+#include
#include
namespace Genode { class Signal_source_client; }
struct Genode::Signal_source_client : Rpc_client
{
- Signal_source_client(Capability signal_source)
+ Signal_source_client(Cpu_session &, Capability signal_source)
: Rpc_client(signal_source) { }
Signal wait_for_signal() override { return call(); }
diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base/component.cc
index 82b8642ca7..50c0cb7a9a 100644
--- a/repos/base/src/lib/base/component.cc
+++ b/repos/base/src/lib/base/component.cc
@@ -243,6 +243,7 @@ struct Genode::Startup
::Env env { ep };
bool const exception_handling = (init_exception_handling(env), true);
+ bool const signal_receiver = (init_signal_receiver(env.pd(), env.parent()), true);
/*
* The construction of the main entrypoint does never return.
diff --git a/repos/base/src/lib/base/signal.cc b/repos/base/src/lib/base/signal.cc
index 2edfcb965f..e4f488d517 100644
--- a/repos/base/src/lib/base/signal.cc
+++ b/repos/base/src/lib/base/signal.cc
@@ -19,7 +19,6 @@
#include
#include
#include
-#include
/* base-internal includes */
#include
@@ -28,10 +27,14 @@
using namespace Genode;
+
class Signal_handler_thread : Thread, Blockade
{
private:
+ Pd_session &_pd;
+ Cpu_session &_cpu;
+
/**
* Actual signal source
*
@@ -43,7 +46,7 @@ class Signal_handler_thread : Thread, Blockade
void entry() override
{
- _signal_source.construct(env_deprecated()->pd_session()->alloc_signal_source());
+ _signal_source.construct(_cpu, _pd.alloc_signal_source());
wakeup();
Signal_receiver::dispatch_signals(&(*_signal_source));
}
@@ -56,7 +59,8 @@ class Signal_handler_thread : Thread, Blockade
* Constructor
*/
Signal_handler_thread(Env &env)
- : Thread(env, "signal handler", STACK_SIZE)
+ :
+ Thread(env, "signal handler", STACK_SIZE), _pd(env.pd()), _cpu(env.cpu())
{
start();
@@ -70,7 +74,7 @@ class Signal_handler_thread : Thread, Blockade
~Signal_handler_thread()
{
- env_deprecated()->pd_session()->free_signal_source(_signal_source->rpc_cap());
+ _pd.free_signal_source(_signal_source->rpc_cap());
}
};
@@ -202,7 +206,17 @@ Genode::Signal_context_registry *signal_context_registry()
** Signal receiver **
*********************/
-Signal_receiver::Signal_receiver() { }
+static Pd_session *_pd_ptr;
+static Parent *_parent_ptr;
+
+
+Signal_receiver::Signal_receiver() : _pd(*_pd_ptr)
+{
+ if (!_pd_ptr) {
+ struct Missing_call_of_init_signal_receiver { };
+ throw Missing_call_of_init_signal_receiver();
+ }
+}
Signal_context_capability Signal_receiver::manage(Signal_context *context)
@@ -227,7 +241,7 @@ Signal_context_capability Signal_receiver::manage(Signal_context *context)
try {
/* use signal context as imprint */
- context->_cap = env_deprecated()->pd_session()->alloc_context(_cap, (long)context);
+ context->_cap = _pd.alloc_context(_cap, (long)context);
break;
}
catch (Out_of_ram) { ram_upgrade = Ram_quota { 1024*sizeof(long) }; }
@@ -236,9 +250,9 @@ Signal_context_capability Signal_receiver::manage(Signal_context *context)
log("upgrading quota donation for PD session "
"(", ram_upgrade, " bytes, ", cap_upgrade, " caps)");
- env_deprecated()->parent()->upgrade(Parent::Env::pd(),
- String<100>("ram_quota=", ram_upgrade, ", "
- "cap_quota=", cap_upgrade).string());
+ _parent_ptr->upgrade(Parent::Env::pd(),
+ String<100>("ram_quota=", ram_upgrade, ", "
+ "cap_quota=", cap_upgrade).string());
}
return context->_cap;
@@ -360,3 +374,10 @@ void Signal_receiver::_platform_finish_dissolve(Signal_context *) { }
void Signal_receiver::_platform_destructor() { }
+
+
+void Genode::init_signal_receiver(Pd_session &pd, Parent &parent)
+{
+ _pd_ptr = &pd;
+ _parent_ptr = &parent;
+}
diff --git a/repos/base/src/lib/base/signal_common.cc b/repos/base/src/lib/base/signal_common.cc
index e1eb8bc1a9..9d842f6042 100644
--- a/repos/base/src/lib/base/signal_common.cc
+++ b/repos/base/src/lib/base/signal_common.cc
@@ -17,7 +17,6 @@
#include
#include
#include
-#include
using namespace Genode;
@@ -178,7 +177,7 @@ Signal_receiver::~Signal_receiver()
void Signal_receiver::_unsynchronized_dissolve(Signal_context * const context)
{
/* tell core to stop sending signals referring to the context */
- env_deprecated()->pd_session()->free_context(context->_cap);
+ _pd.free_context(context->_cap);
/* restore default initialization of signal context */
context->_receiver = nullptr;