From 3ea910bf8324847a14b5c94235b9cb7b88b3a9e9 Mon Sep 17 00:00:00 2001 From: Johannes Schlatow Date: Thu, 7 Jul 2022 15:14:56 +0200 Subject: [PATCH] packet_stream: reset wakeup_needed on wakeup() The wakeup call only emits a single signal as it assumed both are handled by the same signal handler. However, the original implementation did not reset the wakeup_needed variable properly. genodelabs/genode#4555 --- repos/os/include/os/packet_stream.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/repos/os/include/os/packet_stream.h b/repos/os/include/os/packet_stream.h index 6b42c0abfd..7705670654 100644 --- a/repos/os/include/os/packet_stream.h +++ b/repos/os/include/os/packet_stream.h @@ -444,13 +444,13 @@ class Genode::Packet_descriptor_receiver return packet; } - bool rx_wakeup() + bool rx_wakeup(bool omit_signal) { Genode::Mutex::Guard mutex_guard(_rx_queue_mutex); bool signal_submitted = false; - if (_rx_wakeup_needed) { + if (_rx_wakeup_needed && !omit_signal) { _tx_ready.submit(); signal_submitted = true; } @@ -778,7 +778,7 @@ class Genode::Packet_stream_source : private Packet_stream_base void wakeup() { /* submit only one signal, prefer submit transmitter over ack receiver */ - _submit_transmitter.tx_wakeup() || _ack_receiver.rx_wakeup(); + _ack_receiver.rx_wakeup(_submit_transmitter.tx_wakeup()); } /** @@ -937,7 +937,7 @@ class Genode::Packet_stream_sink : private Packet_stream_base void wakeup() { /* submit only one signal, prefer ack_avail signal over ready_to_submit */ - _ack_transmitter.tx_wakeup() || _submit_receiver.rx_wakeup(); + _submit_receiver.rx_wakeup(_ack_transmitter.tx_wakeup()); } /**