Allow system call restarts upon signal interruption

The X server frequently deals with SIGIO and SIGALRM interruptions.
If process execution is inside certain blocking system calls
when these signals arrive, e.g. with the kernel blocked on
a contended semaphore, the system calls will be interrupted.

Some system calls are automatically restartable (the kernel re-executes
them with the same parameters once the signal handler returns) but
only if the signal handler allows it.

Set SA_RESTART on the signal handlers to enable this convenient
behaviour.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Daniel Drake <drake@endlessm.com>
(cherry picked from commit 94ab7455ab)
This commit is contained in:
Daniel Drake 2015-05-12 16:39:22 -06:00 committed by Adam Jackson
parent d2e4a9d4ac
commit f92c0b9f94
2 changed files with 2 additions and 1 deletions

View File

@ -178,7 +178,7 @@ xf86InstallSIGIOHandler(int fd, void (*f) (int, void *), void *closure)
}
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGIO);
sa.sa_flags = 0;
sa.sa_flags = SA_RESTART;
sa.sa_handler = xf86SIGIO;
sigaction(SIGIO, &sa, &osa);
xf86SigIOFuncs[i].fd = fd;

View File

@ -1220,6 +1220,7 @@ SmartScheduleInit(void)
memset((char *) &act, 0, sizeof(struct sigaction));
/* Set up the timer signal function */
act.sa_flags = SA_RESTART;
act.sa_handler = SmartScheduleTimer;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGALRM);