Fix ppoll(2) EINTR handling.
This commit is contained in:
parent
b46c25ea0c
commit
bfa2083ff0
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) )
|
||||
{
|
||||
ret = -1;
|
||||
errno = -EINTR;
|
||||
self_woken = true;
|
||||
deliver_signal = true;
|
||||
|
@ -327,7 +328,7 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds,
|
|||
timer.Detach();
|
||||
}
|
||||
|
||||
if ( !unexpected_error )
|
||||
if ( !deliver_signal && !unexpected_error )
|
||||
{
|
||||
int num_events = 0;
|
||||
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 )
|
||||
errno = 0;
|
||||
|
||||
if ( Signal::IsPending() )
|
||||
ret = -1, errno = EINTR, deliver_signal = true;
|
||||
|
||||
if ( user_sigmask )
|
||||
{
|
||||
if ( !deliver_signal )
|
||||
|
|
Loading…
Reference in a new issue