guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 05/11: Document sigaction + SA_RESTART


From: Andy Wingo
Subject: [Guile-commits] 05/11: Document sigaction + SA_RESTART
Date: Tue, 21 Jun 2016 16:10:00 +0000 (UTC)

wingo pushed a commit to branch stable-2.0
in repository guile.

commit 6dc06a5ec605d5b568ba05e65ba67c122d72a5db
Author: Andy Wingo <address@hidden>
Date:   Tue Jun 21 08:35:59 2016 +0200

    Document sigaction + SA_RESTART
    
    * doc/ref/posix.texi (Signals): Document interaction between Guile's
      signal handling and SA_RESTART.  Fixes #14640.
---
 doc/ref/posix.texi |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/doc/ref/posix.texi b/doc/ref/posix.texi
index ad5460c..a5157a3 100644
--- a/doc/ref/posix.texi
+++ b/doc/ref/posix.texi
@@ -2086,6 +2086,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
address@hidden 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.
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]