From af80ecb651693c0f2decea9b271571d9b16cbdcb Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Wed, 6 Apr 2022 22:34:15 +0200 Subject: [PATCH] dde_rump: check blocking condition right before blocking Issue #4459 --- repos/dde_rump/src/lib/rump/io.cc | 40 ++++++++++++++++++------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/repos/dde_rump/src/lib/rump/io.cc b/repos/dde_rump/src/lib/rump/io.cc index bdf08b34d0..374dd8cdee 100644 --- a/repos/dde_rump/src/lib/rump/io.cc +++ b/repos/dde_rump/src/lib/rump/io.cc @@ -49,28 +49,37 @@ class Io_signal_blockade : public Genode::Io_signal_handler public: - Io_signal_blockade(Entrypoint &ep) + Io_signal_blockade(Genode::Entrypoint &ep, + Genode::Thread const *ep_thread) : Io_signal_handler(ep, *this, &Io_signal_blockade::_handle_io_signal), - _ep(ep) - { - _ep_thread_ptr = Genode::Thread::myself(); - } + _ep(ep), + _ep_thread_ptr(ep_thread) { } - void block_for_io() + template + void block_for_io(FUNC const &should_block) { if (Genode::Thread::myself() == _ep_thread_ptr) { - while (!_signal_handler_called) - _ep.wait_and_dispatch_one_io_signal(); + while (should_block()) { + + while (!_signal_handler_called) + _ep.wait_and_dispatch_one_io_signal(); + + _signal_handler_called = false; + } _signal_handler_called = false; } else { - Registered_blockade _blockade { _blockades }; - _blockade.block(); + while (should_block()) { + Registered_blockade _blockade { _blockades }; + + if (should_block()) + _blockade.block(); + } } } }; @@ -101,7 +110,8 @@ class Backend Block::Connection _session { Rump::env().env(), &_alloc }; Block::Session::Info _info { _session.info() }; Genode::Mutex _session_mutex; - Io_signal_blockade _io_signal_blockade { _ep }; + Io_signal_blockade _io_signal_blockade { _ep, + Genode::Thread::myself() }; int _blocked_for_synchronous_io = 0; @@ -154,12 +164,10 @@ class Backend _blocked_for_synchronous_io++; } - _update_jobs(); - - while (!job->completed()) { - _io_signal_blockade.block_for_io(); + _io_signal_blockade.block_for_io([&]() { _update_jobs(); - } + return !job->completed(); + }); bool const success = job->success;