From d3e53b3ccabe8f036b23ad09e34938b4d8b2c33b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Fri, 3 Jun 2022 16:15:44 +0200 Subject: [PATCH] pc_wifi_drv: unblock pthread via signal Since unblocking the pthread directly may lead to corruption we need to post-pone it. So we send a signal that should be handled by the EP after the EP has finished its current line of work. Fixes #4523. --- repos/pc/src/lib/wifi/socket_call.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/repos/pc/src/lib/wifi/socket_call.cc b/repos/pc/src/lib/wifi/socket_call.cc index 63eb435763..ae7023af59 100644 --- a/repos/pc/src/lib/wifi/socket_call.cc +++ b/repos/pc/src/lib/wifi/socket_call.cc @@ -237,6 +237,8 @@ class Lx::Socket Genode::Signal_transmitter _sender { }; Genode::Signal_handler _dispatcher; + Genode::Signal_handler _dispatcher_blockade; + struct socket *_sock_poll_table[Wifi::MAX_POLL_SOCKETS] { }; struct socket *_call_socket() @@ -411,11 +413,17 @@ class Lx::Socket Lx_kit::env().scheduler.schedule(); } + void _handle_blockade() + { + _block.up(); + } + public: Socket(Genode::Entrypoint &ep) : - _dispatcher(ep, *this, &Lx::Socket::_handle) + _dispatcher(ep, *this, &Lx::Socket::_handle), + _dispatcher_blockade(ep, *this, &Lx::Socket::_handle_blockade) { _sender.context(_dispatcher); } @@ -448,7 +456,7 @@ class Lx::Socket _call.opcode = Call::NONE; - if (old != Call::NONE) { _block.up(); } + if (old != Call::NONE) { _dispatcher_blockade.local_submit(); } } void submit_and_block()