diff --git a/base-codezero/lib/mk/base-common.mk b/base-codezero/lib/mk/base-common.mk
index e11e97cca3..027a8089fe 100644
--- a/base-codezero/lib/mk/base-common.mk
+++ b/base-codezero/lib/mk/base-common.mk
@@ -18,7 +18,7 @@ SRC_CC += child/child.cc
SRC_CC += process/process.cc
SRC_CC += elf/elf_binary.cc
SRC_CC += lock/lock.cc
-SRC_CC += signal/signal.cc
+SRC_CC += signal/signal.cc signal/common.cc
SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
SRC_CC += env/utcb.cc
diff --git a/base-fiasco/lib/mk/base-common.mk b/base-fiasco/lib/mk/base-common.mk
index f38c976010..a0857e969a 100644
--- a/base-fiasco/lib/mk/base-common.mk
+++ b/base-fiasco/lib/mk/base-common.mk
@@ -18,7 +18,7 @@ SRC_CC += child/child.cc
SRC_CC += process/process.cc
SRC_CC += elf/elf_binary.cc
SRC_CC += lock/lock.cc
-SRC_CC += signal/signal.cc
+SRC_CC += signal/signal.cc signal/common.cc
SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
diff --git a/base-foc/lib/mk/base-common.inc b/base-foc/lib/mk/base-common.inc
index 071cb70092..2c172864b8 100644
--- a/base-foc/lib/mk/base-common.inc
+++ b/base-foc/lib/mk/base-common.inc
@@ -18,7 +18,7 @@ SRC_CC += process/process.cc
SRC_CC += elf/elf_binary.cc
SRC_CC += lock/lock.cc
SRC_CC += env/spin_lock.cc env/cap_map.cc
-SRC_CC += signal/signal.cc
+SRC_CC += signal/signal.cc signal/common.cc
SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap.cc
diff --git a/base-host/lib/mk/base-common.mk b/base-host/lib/mk/base-common.mk
index 9c44da0dc0..d421a4b3d0 100644
--- a/base-host/lib/mk/base-common.mk
+++ b/base-host/lib/mk/base-common.mk
@@ -18,7 +18,7 @@ SRC_CC += child/child.cc
SRC_CC += process/process.cc
SRC_CC += elf/elf_binary.cc
SRC_CC += lock/lock.cc
-SRC_CC += signal/signal.cc
+SRC_CC += signal/signal.cc signal/common.cc
SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
diff --git a/base-linux/lib/mk/base-common.mk b/base-linux/lib/mk/base-common.mk
index 45b1f07fe4..a394adf7e7 100644
--- a/base-linux/lib/mk/base-common.mk
+++ b/base-linux/lib/mk/base-common.mk
@@ -17,7 +17,7 @@ SRC_CC += process/process.cc
SRC_CC += elf/elf_binary.cc
SRC_CC += lock/lock.cc
SRC_CC += env/rm_session_mmap.cc env/debug.cc
-SRC_CC += signal/signal.cc
+SRC_CC += signal/signal.cc signal/common.cc
SRC_CC += server/server.cc server/common.cc
INC_DIR += $(REP_DIR)/src/base/lock $(BASE_DIR)/src/base/lock
diff --git a/base-nova/lib/mk/base-common.inc b/base-nova/lib/mk/base-common.inc
index 70fb31be69..13fe0c5d11 100644
--- a/base-nova/lib/mk/base-common.inc
+++ b/base-nova/lib/mk/base-common.inc
@@ -16,7 +16,7 @@ SRC_CC += child/child.cc
SRC_CC += process/process.cc
SRC_CC += elf/elf_binary.cc
SRC_CC += lock/lock.cc
-SRC_CC += signal/signal.cc
+SRC_CC += signal/signal.cc signal/common.cc
SRC_CC += server/server.cc
SRC_CC += thread/thread.cc thread/thread_context.cc
diff --git a/base-okl4/lib/mk/base-common.mk b/base-okl4/lib/mk/base-common.mk
index 78687ffe12..f9840f19b1 100644
--- a/base-okl4/lib/mk/base-common.mk
+++ b/base-okl4/lib/mk/base-common.mk
@@ -18,7 +18,7 @@ SRC_CC += child/child.cc
SRC_CC += process/process.cc
SRC_CC += elf/elf_binary.cc
SRC_CC += lock/lock.cc
-SRC_CC += signal/signal.cc
+SRC_CC += signal/signal.cc signal/common.cc
SRC_CC += server/server.cc server/common.cc
INC_DIR += $(REP_DIR)/src/base/lock
diff --git a/base-pistachio/lib/mk/base-common.mk b/base-pistachio/lib/mk/base-common.mk
index f38c976010..a0857e969a 100644
--- a/base-pistachio/lib/mk/base-common.mk
+++ b/base-pistachio/lib/mk/base-common.mk
@@ -18,7 +18,7 @@ SRC_CC += child/child.cc
SRC_CC += process/process.cc
SRC_CC += elf/elf_binary.cc
SRC_CC += lock/lock.cc
-SRC_CC += signal/signal.cc
+SRC_CC += signal/signal.cc signal/common.cc
SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
diff --git a/base/include/base/signal.h b/base/include/base/signal.h
index 51a42f44e5..458fd26c93 100644
--- a/base/include/base/signal.h
+++ b/base/include/base/signal.h
@@ -20,8 +20,12 @@
#include
#include
+/* only needed for base-hw */
+namespace Kernel { struct Signal_receiver; }
+
namespace Genode {
+ class Signal_source;
class Signal_receiver;
class Signal_context;
class Signal_context_registry;
@@ -79,6 +83,7 @@ namespace Genode {
*/
Signal(Data data);
+ friend class Kernel::Signal_receiver;
friend class Signal_receiver;
friend class Signal_context;
@@ -218,7 +223,17 @@ namespace Genode {
{
private:
- Semaphore _signal_available; /* signal(s) awaiting to be picked up */
+ /**
+ * Semaphore used to indicate that signal(s) are ready to be picked
+ * up. This is needed for platforms other than 'base-hw' only.
+ */
+ Semaphore _signal_available;
+
+ /**
+ * Provides the kernel-object name via the 'dst' method. This is
+ * needed for 'base-hw' only.
+ */
+ Signal_receiver_capability _cap;
/**
* List of associated contexts
diff --git a/base/include/signal_session/signal_session.h b/base/include/signal_session/signal_session.h
index b6c9abdc57..8b344879ad 100644
--- a/base/include/signal_session/signal_session.h
+++ b/base/include/signal_session/signal_session.h
@@ -22,10 +22,12 @@
namespace Genode {
class Signal_context;
+ class Signal_receiver;
- typedef Capability Signal_context_capability;
- typedef Capability Signal_source_capability;
+ typedef Capability Signal_receiver_capability;
+ typedef Capability Signal_context_capability;
+ typedef Capability Signal_source_capability;
struct Signal_session : Session
diff --git a/base/src/base/signal/common.cc b/base/src/base/signal/common.cc
new file mode 100644
index 0000000000..da9ab094ff
--- /dev/null
+++ b/base/src/base/signal/common.cc
@@ -0,0 +1,73 @@
+/*
+ * \brief Platform-independent part of signal framework
+ * \author Norman Feske
+ * \author Christian Prochaska
+ * \author Martin Stein
+ * \date 2013-02-21
+ */
+
+/*
+ * Copyright (C) 2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* Genode includes */
+#include
+
+using namespace Genode;
+
+
+/************
+ ** Signal **
+ ************/
+
+Signal::Signal(Signal const &other) { _inc_ref(); }
+
+
+Signal & Signal::operator=(Signal const &other)
+{
+ if ((_data.context == other._data.context) &&
+ (_data.num == other._data.num))
+ return *this;
+
+ _dec_ref_and_unlock();
+
+ _data.context = other._data.context;
+ _data.num = other._data.num;
+
+ _inc_ref();
+
+ return *this;
+}
+
+
+Signal::~Signal() { _dec_ref_and_unlock(); };
+
+
+/************************
+ ** Signal_transmitter **
+ ************************/
+
+Signal_transmitter::Signal_transmitter(Signal_context_capability context)
+: _context(context) { }
+
+
+void Signal_transmitter::context(Signal_context_capability context) {
+ _context = context; }
+
+
+/*********************
+ ** Signal_receiver **
+ *********************/
+
+Signal_receiver::~Signal_receiver()
+{
+ Lock::Guard list_lock_guard(_contexts_lock);
+
+ /* disassociate contexts from the receiver */
+ for (List_element *le; (le = _contexts.first()); )
+ _unsynchronized_dissolve(le->object());
+}
+
diff --git a/base/src/base/signal/signal.cc b/base/src/base/signal/signal.cc
index 53a22316ca..d7c373d5ee 100644
--- a/base/src/base/signal/signal.cc
+++ b/base/src/base/signal/signal.cc
@@ -198,49 +198,10 @@ Signal::Signal(Signal::Data data) : _data(data)
}
-Signal::Signal(Signal const &other) : _data(other._data)
-{
- _inc_ref();
-}
-
-
-Signal::~Signal()
-{
- _dec_ref_and_unlock();
-}
-
-
-Signal &Signal::operator=(Signal const &other)
-{
- if ((_data.context == other._data.context)
- && (_data.num == other._data.num))
- return *this;
-
- _dec_ref_and_unlock();
-
- _data.context = other._data.context;
- _data.num = other._data.num;
-
- _inc_ref();
-
- return *this;
-}
-
-
/************************
** Signal transmitter **
************************/
-Signal_transmitter::Signal_transmitter(Signal_context_capability context)
-: _context(context) { }
-
-
-void Signal_transmitter::context(Signal_context_capability context)
-{
- _context = context;
-}
-
-
void Signal_transmitter::submit(unsigned cnt)
{
signal_connection()->submit(_context, cnt);
@@ -275,16 +236,6 @@ Signal_receiver::Signal_receiver()
}
-Signal_receiver::~Signal_receiver()
-{
- Lock::Guard list_lock_guard(_contexts_lock);
-
- /* disassociate contexts from the receiver */
- for (List_element *le; (le = _contexts.first()); )
- _unsynchronized_dissolve(le->object());
-}
-
-
Signal_context_capability Signal_receiver::manage(Signal_context *context)
{
if (context->_receiver)