1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

Document sigaction + SA_RESTART

* doc/ref/posix.texi (Signals): Document interaction between Guile's
  signal handling and SA_RESTART.  Fixes #14640.
This commit is contained in:
Andy Wingo 2016-06-21 08:35:59 +02:00
parent fff013215f
commit e877e1bccb

View file

@ -2075,6 +2075,22 @@ restart the system call (as opposed to returning an @code{EINTR} error
from that call).
@end defvar
Guile handles signals asynchronously. When it receives a signal, the
synchronous signal handler just records the fact that a signal was
received and sets a flag to tell the relevant Guile thread that it has a
pending signal. When the Guile thread checks the pending-interrupt
flag, it will arrange to run the asynchronous part of the signal
handler, which is the handler attached by @code{sigaction}.
This strategy has some perhaps-unexpected interactions with the
@code{SA_RESTART} flag, though: because the synchronous handler doesn't
do very much, and notably it doesn't run the Guile handler, it's
impossible to interrupt a thread stuck in a long-running system call via
a signal handler that is installed with @code{SA_RESTART}: the
synchronous handler just records the pending interrupt, but then the
system call resumes and Guile doesn't have a chance to actually check
the flag and run the asynchronous handler. That's just how it is.
The return value is a pair with information about the old handler as
described above.