libc: dispatch pending signals at selective points

This commit is contained in:
Christian Helmuth
2017-05-18 16:04:21 +02:00
parent 491be000ca
commit b1c9db8a0d
6 changed files with 61 additions and 6 deletions

View File

@ -172,7 +172,7 @@ void Entrypoint::_process_incoming_signals()
}
void Entrypoint::wait_and_dispatch_one_io_signal()
bool Entrypoint::_wait_and_dispatch_one_io_signal(bool const dont_block)
{
for (;;) {
@ -198,6 +198,11 @@ void Entrypoint::wait_and_dispatch_one_io_signal()
} catch (Signal_receiver::Signal_not_pending) {
_signal_pending_lock.unlock();
if (dont_block) {
/* indicate that we leave wait_and_dispatch_one_io_signal */
cmpxchg(&_signal_recipient, ENTRYPOINT, NONE);
return false;
}
_sig_rec->block_for_signal();
}
}
@ -212,6 +217,8 @@ void Entrypoint::wait_and_dispatch_one_io_signal()
&Entrypoint::_handle_deferred_signals);
Signal_transmitter(*_deferred_signal_handler).submit();
}
return true;
}