diff --git a/repos/base/include/base/signal.h b/repos/base/include/base/signal.h index 55ce6f4739..acd3e1cd92 100644 --- a/repos/base/include/base/signal.h +++ b/repos/base/include/base/signal.h @@ -132,6 +132,13 @@ namespace Genode { */ void context(Signal_context_capability context); + + /** + * Return signal context + */ + Signal_context_capability context(); + + /** * Trigger signal submission to context * diff --git a/repos/base/src/base/signal/common.cc b/repos/base/src/base/signal/common.cc index 02d9abf426..7de4ebe654 100644 --- a/repos/base/src/base/signal/common.cc +++ b/repos/base/src/base/signal/common.cc @@ -78,6 +78,8 @@ Signal_transmitter::Signal_transmitter(Signal_context_capability context) void Signal_transmitter::context(Signal_context_capability context) { _context = context; } +Signal_context_capability Signal_transmitter::context() { return _context; } + /********************* ** Signal_receiver ** diff --git a/repos/os/include/os/packet_stream.h b/repos/os/include/os/packet_stream.h index 03c57c8804..61dd7b51cc 100644 --- a/repos/os/include/os/packet_stream.h +++ b/repos/os/include/os/packet_stream.h @@ -260,6 +260,14 @@ class Packet_descriptor_transmitter void register_rx_ready_cap(Genode::Signal_context_capability cap) { _rx_ready.context(cap); + + /* + * if a packet was already put into the queue + * before a signal handler was registered, + * a signal has to be send again + */ + if (!_tx_queue->empty()) + _rx_ready.submit(); } bool ready_for_tx() @@ -341,6 +349,14 @@ class Packet_descriptor_receiver void register_tx_ready_cap(Genode::Signal_context_capability cap) { _tx_ready.context(cap); + + /* + * if a packet was already put into the queue + * before a signal handler was registered, + * a signal has to be send again + */ + if (!_rx_queue->empty()) + _tx_ready.submit(); } bool ready_for_rx()