changeset 5770:6a9244f89a2a

[project @ 2006-04-18 17:44:33 by jwe]
author jwe
date Tue, 18 Apr 2006 17:44:33 +0000
parents 2b9a5ce46678
children 9c7be8e14b5b
files src/ChangeLog src/pr-output.cc src/sighandlers.cc src/sighandlers.h src/sysdep.cc src/utils.cc
diffstat 6 files changed, 38 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Apr 18 15:57:06 2006 +0000
+++ b/src/ChangeLog	Tue Apr 18 17:44:33 2006 +0000
@@ -1,5 +1,11 @@
 2006-04-18  John W. Eaton  <jwe@octave.org>
 
+	* sighandlers.cc (octave_set_signal_handler,
+	octave_set_interrupt_handler): New arg, restart_syscalls, with
+	default value true.
+	* sighandlers.h: Fix decls to match.
+	* sysdep.cc (octave_kbhit): Disable restarting of system calls.
+
 	* help.cc (Flookfor): Add std qualifier to transform function.
 	Include <algorithm>, for transform decl.
 
--- a/src/pr-output.cc	Tue Apr 18 15:57:06 2006 +0000
+++ b/src/pr-output.cc	Tue Apr 18 17:44:33 2006 +0000
@@ -1351,7 +1351,7 @@
 }
 
 template <class T>
-inline void
+static inline void
 pr_plus_format (std::ostream& os, const T& val)
 {
   if (val > T (0))
--- a/src/sighandlers.cc	Tue Apr 18 15:57:06 2006 +0000
+++ b/src/sighandlers.cc	Tue Apr 18 17:44:33 2006 +0000
@@ -185,7 +185,8 @@
 }
 
 sig_handler *
-octave_set_signal_handler (int sig, sig_handler *handler)
+octave_set_signal_handler (int sig, sig_handler *handler,
+			   bool restart_syscalls)
 {
 #if defined (HAVE_POSIX_SIGNALS)
   struct sigaction act, oact;
@@ -199,12 +200,11 @@
       act.sa_flags |= SA_INTERRUPT;
 #endif
     }
-  else
-    {
 #if defined (SA_RESTART)
-      act.sa_flags |= SA_RESTART;
+  // XXX FIXME XXX -- Do we also need to explicitly disable SA_RESTART?
+  else if (restart_syscalls)
+    act.sa_flags |= SA_RESTART;
 #endif
-    }
 
   sigemptyset (&act.sa_mask);
   sigemptyset (&oact.sa_mask);
@@ -543,16 +543,19 @@
 }
 
 octave_interrupt_handler
-octave_set_interrupt_handler (const volatile octave_interrupt_handler& h)
+octave_set_interrupt_handler (const volatile octave_interrupt_handler& h,
+			      bool restart_syscalls)
 {
   octave_interrupt_handler retval;
 
 #ifdef SIGINT
-  retval.int_handler = octave_set_signal_handler (SIGINT, h.int_handler);
+  retval.int_handler = octave_set_signal_handler (SIGINT, h.int_handler,
+						  restart_syscalls);
 #endif
 
 #ifdef SIGBREAK
-  retval.brk_handler = octave_set_signal_handler (SIGBREAK, h.brk_handler);
+  retval.brk_handler = octave_set_signal_handler (SIGBREAK, h.brk_handler,
+						  restart_syscalls);
 #endif
 
   return retval;
--- a/src/sighandlers.h	Tue Apr 18 15:57:06 2006 +0000
+++ b/src/sighandlers.h	Tue Apr 18 17:44:33 2006 +0000
@@ -97,7 +97,8 @@
 // TRUE means we can be interrupted.
 extern bool can_interrupt;
 
-extern sig_handler *octave_set_signal_handler (int, sig_handler *);
+extern sig_handler *octave_set_signal_handler (int, sig_handler *,
+					       bool restart_syscalls = true);
 
 extern void install_signal_handlers (void);
 
@@ -108,7 +109,8 @@
 extern octave_interrupt_handler octave_ignore_interrupts (void);
 
 extern octave_interrupt_handler
-octave_set_interrupt_handler (const volatile octave_interrupt_handler&);
+octave_set_interrupt_handler (const volatile octave_interrupt_handler&,
+			      bool restart_syscalls = true);
 
 // extern void ignore_sigchld (void);
 
--- a/src/sysdep.cc	Tue Apr 18 15:57:06 2006 +0000
+++ b/src/sysdep.cc	Tue Apr 18 17:44:33 2006 +0000
@@ -83,6 +83,7 @@
 #include "oct-obj.h"
 #include "ov.h"
 #include "pager.h"
+#include "sighandlers.h"
 #include "sysdep.h"
 #include "toplev.h"
 #include "utils.h"
@@ -417,11 +418,23 @@
 #else
   raw_mode (true, wait);
 
+  // Get current handler.
+  octave_interrupt_handler saved_interrupt_handler
+    = octave_ignore_interrupts ();
+
+  // Restore it, disabling system call restarts (if possible) so the
+  // read can be interrupted.
+
+  octave_set_interrupt_handler (saved_interrupt_handler, false);
+
   int c = std::cin.get ();
-
+ 
   if (std::cin.fail () || std::cin.eof ())
     std::cin.clear ();
 
+  // Restore it, enabling system call restarts (if possible).
+  octave_set_interrupt_handler (saved_interrupt_handler, true);
+
   raw_mode (false, true);
 #endif
 
--- a/src/utils.cc	Tue Apr 18 15:57:06 2006 +0000
+++ b/src/utils.cc	Tue Apr 18 17:44:33 2006 +0000
@@ -1117,6 +1117,8 @@
       unsigned int sec
 	= (t > UINT_MAX) ? UINT_MAX : static_cast<unsigned int> (t);
 
+      // Versions of these functions that accept unsigned int args are
+      // defined in cutils.c.
       octave_sleep (sec);
       octave_usleep (usec);
     }