Mercurial > hg > octave-thorsten
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 +++ b/src/ChangeLog @@ -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 +++ b/src/pr-output.cc @@ -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 +++ b/src/sighandlers.cc @@ -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 +++ b/src/sighandlers.h @@ -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 +++ b/src/sysdep.cc @@ -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