# HG changeset patch # User jwe # Date 1067532489 0 # Node ID ef4bdde0805d51da20705552f4363a52cef6822c # Parent 32b491743d40f47cf5649add2648f0a3d07dd72c [project @ 2003-10-30 16:48:09 by jwe] diff --git a/libcruft/ChangeLog b/libcruft/ChangeLog --- a/libcruft/ChangeLog +++ b/libcruft/ChangeLog @@ -1,3 +1,13 @@ +2003-10-30 John W. Eaton + + * Makefile.in (MISC_OBJ): Add misc/cquit.o to the list. + + * misc/Makefile.in (SPECIAL_SRC): Add cquit.c to the list. + * misc/cquit.c: New file. + * misc/quit.cc: Move everything except octave_interrupt_hook, + octave_bad_alloc_hook, octave_throw_interrupt_exception, and + octave_throw_bad_alloc to cquit.c. + 2003-10-28 John W. Eaton * misc/quit.h (octave_interrupt_hook, octave_bad_alloc_hook): diff --git a/libcruft/Makefile.in b/libcruft/Makefile.in --- a/libcruft/Makefile.in +++ b/libcruft/Makefile.in @@ -62,7 +62,7 @@ # a normal archive file (created from PIC code, though). MISC_OBJ := misc/machar.o misc/f77-extern.o \ - misc/f77-fcn.o misc/lo-error.o misc/quit.o + misc/f77-fcn.o misc/lo-error.o misc/quit.o misc/cquit.o CRUFT_FSRC := $(foreach dir, $(SUBDIRS), $(wildcard $(srcdir)/$(dir)/*.f)) CRUFT_OBJ2 := $(patsubst $(srcdir)/%, %, $(CRUFT_FSRC)) diff --git a/libcruft/misc/Makefile.in b/libcruft/misc/Makefile.in --- a/libcruft/misc/Makefile.in +++ b/libcruft/misc/Makefile.in @@ -12,7 +12,7 @@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -SPECIAL_SRC := machar.c f77-extern.cc f77-fcn.c lo-error.c quit.cc +SPECIAL_SRC := machar.c f77-extern.cc f77-fcn.c lo-error.c cquit.c quit.cc DEP_1 := $(patsubst %.c, %.d, $(SPECIAL_SRC)) MAKEDEPS := $(patsubst %.cc, %.d, $(DEP_1)) diff --git a/libcruft/misc/cquit.c b/libcruft/misc/cquit.c new file mode 100644 --- /dev/null +++ b/libcruft/misc/cquit.c @@ -0,0 +1,94 @@ +/* + +Copyright (C) 2003 John W. Eaton + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "quit.h" + +octave_jmp_buf current_context; + +void +octave_save_current_context (void *save_buf) +{ + memcpy (save_buf, current_context, sizeof (octave_jmp_buf)); +} + +void +octave_restore_current_context (void *save_buf) +{ + memcpy (current_context, save_buf, sizeof (octave_jmp_buf)); +} + +void +octave_jump_to_enclosing_context (void) +{ +#if defined (OCTAVE_HAVE_SIG_JUMP) + siglongjmp (current_context, 1); +#else + longjmp (current_context, 1); +#endif +} + +// Allow us to save the signal mask and then restore it to the most +// recently saved value. This is necessary when using the POSIX +// signal handling interface on some systems calling longjmp out of +// the signal handler to get to the top level on an interrupt doesn't +// restore the original signal mask. Alternatively, we could use +// sigsetjmp/siglongjmp, but saving and restoring the signal mask +// ourselves works ok and seems simpler just now. + +#if defined (HAVE_POSIX_SIGNALS) +static sigset_t octave_signal_mask; +#endif + +void +octave_save_signal_mask (void) +{ +#if defined (HAVE_POSIX_SIGNALS) + sigprocmask (0, 0, &octave_signal_mask); +#endif +} + +void +octave_restore_signal_mask (void) +{ +#if defined (HAVE_POSIX_SIGNALS) + sigprocmask (SIG_SETMASK, &octave_signal_mask, 0); +#endif +} + +sig_atomic_t octave_interrupt_immediately = 0; + +sig_atomic_t octave_interrupt_state = 0; + +sig_atomic_t octave_allocation_error = 0; + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff --git a/libcruft/misc/quit.cc b/libcruft/misc/quit.cc --- a/libcruft/misc/quit.cc +++ b/libcruft/misc/quit.cc @@ -28,75 +28,12 @@ #include -// Include signal.h, not csignal since the latter might only define -// the ANSI standard C signal interface. - -#include - #include "quit.h" -octave_jmp_buf current_context; - void (*octave_interrupt_hook) (void) = 0; void (*octave_bad_alloc_hook) (void) = 0; void -octave_save_current_context (void *save_buf) -{ - std::memcpy (save_buf, current_context, sizeof (octave_jmp_buf)); -} - -void -octave_restore_current_context (void *save_buf) -{ - std::memcpy (current_context, save_buf, sizeof (octave_jmp_buf)); -} - -void -octave_jump_to_enclosing_context (void) -{ -#if defined (OCTAVE_HAVE_SIG_JUMP) - siglongjmp (current_context, 1); -#else - longjmp (current_context, 1); -#endif -} - -// Allow us to save the signal mask and then restore it to the most -// recently saved value. This is necessary when using the POSIX -// signal handling interface on some systems calling longjmp out of -// the signal handler to get to the top level on an interrupt doesn't -// restore the original signal mask. Alternatively, we could use -// sigsetjmp/siglongjmp, but saving and restoring the signal mask -// ourselves works ok and seems simpler just now. - -#if defined (HAVE_POSIX_SIGNALS) -static sigset_t octave_signal_mask; -#endif - -void -octave_save_signal_mask (void) -{ -#if defined (HAVE_POSIX_SIGNALS) - sigprocmask (0, 0, &octave_signal_mask); -#endif -} - -void -octave_restore_signal_mask (void) -{ -#if defined (HAVE_POSIX_SIGNALS) - sigprocmask (SIG_SETMASK, &octave_signal_mask, 0); -#endif -} - -sig_atomic_t octave_interrupt_immediately = 0; - -sig_atomic_t octave_interrupt_state = 0; - -sig_atomic_t octave_allocation_error = 0; - -void octave_throw_interrupt_exception (void) { if (octave_interrupt_hook)