Fix ppoll(2) EINTR handling.
This commit is contained in:
parent
63a6509396
commit
e3af5ae322
1 changed files with 5 additions and 1 deletions
|
@ -309,6 +309,7 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds,
|
||||||
{
|
{
|
||||||
if ( !kthread_cond_wait_signal(&wakeup_cond, &wakeup_mutex) )
|
if ( !kthread_cond_wait_signal(&wakeup_cond, &wakeup_mutex) )
|
||||||
{
|
{
|
||||||
|
ret = -1;
|
||||||
errno = -EINTR;
|
errno = -EINTR;
|
||||||
self_woken = true;
|
self_woken = true;
|
||||||
deliver_signal = true;
|
deliver_signal = true;
|
||||||
|
@ -327,7 +328,7 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds,
|
||||||
timer.Detach();
|
timer.Detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !unexpected_error )
|
if ( !deliver_signal && !unexpected_error )
|
||||||
{
|
{
|
||||||
int num_events = 0;
|
int num_events = 0;
|
||||||
for ( size_t i = 0; i < reqs; i++ )
|
for ( size_t i = 0; i < reqs; i++ )
|
||||||
|
@ -346,6 +347,9 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds,
|
||||||
if ( 0 <= ret )
|
if ( 0 <= ret )
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
|
if ( Signal::IsPending() )
|
||||||
|
ret = -1, errno = EINTR, deliver_signal = true;
|
||||||
|
|
||||||
if ( user_sigmask )
|
if ( user_sigmask )
|
||||||
{
|
{
|
||||||
if ( !deliver_signal )
|
if ( !deliver_signal )
|
||||||
|
|
Loading…
Reference in a new issue