diff --git a/base-codezero/lib/mk/base-common.mk b/base-codezero/lib/mk/base-common.mk index e11e97cca..027a8089f 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 f38c97601..a0857e969 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 071cb7009..2c172864b 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 9c44da0dc..d421a4b3d 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 45b1f07fe..a394adf7e 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 70fb31be6..13fe0c5d1 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 78687ffe1..f9840f19b 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 f38c97601..a0857e969 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 51a42f44e..458fd26c9 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 b6c9abdc5..8b344879a 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 000000000..da9ab094f --- /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 53a22316c..d7c373d5e 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)