Mercurial > octave-nkf
diff src/sighandlers.cc @ 1:78fd87e624cb
[project @ 1993-08-08 01:13:40 by jwe]
Initial revision
author | jwe |
---|---|
date | Sun, 08 Aug 1993 01:13:40 +0000 |
parents | |
children | a99f28f5e351 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sighandlers.cc Sun Aug 08 01:13:40 1993 +0000 @@ -0,0 +1,319 @@ +// sighandlers.cc -*- C++ -*- +/* + +Copyright (C) 1992, 1993 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, 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include <signal.h> + +#include "sighandlers.h" +#include "octave.h" +#include "error.h" +#include "utils.h" + +// Nonzero means we have already printed a message for this series of +// SIGPIPES. We assume that the writer will eventually give up. +int pipe_handler_error_count = 0; + +// Nonzero means we can be interrupted. +int can_interrupt = 0; + +static void +my_friendly_exit (const char *sig_name, int sig_number) +{ + error ("caught %s -- stopping myself...", sig_name); + clean_up_and_exit (sig_number); +} + +/* + * Some of these may eventually perform different actions... + */ + +static RETSIGTYPE +sigabrt_handler (int i) +{ + my_friendly_exit ("SIGABRT", i); +} + +static RETSIGTYPE +sigalrm_handler (int i) +{ + my_friendly_exit ("SIGALRM", i); +} + +static RETSIGTYPE +sigbus_handler (int i) +{ + my_friendly_exit ("SIGBUS", i); +} + +static RETSIGTYPE +sigemt_handler (int i) +{ + my_friendly_exit ("SIGEMT", i); +} + +static RETSIGTYPE +sigfpe_handler (int i) +{ + my_friendly_exit ("SIGFPE", i); +} + +static RETSIGTYPE +sighup_handler (int i) +{ + my_friendly_exit ("SIGHUP", i); +} + +static RETSIGTYPE +sigill_handler (int i) +{ + my_friendly_exit ("SIGILL", i); +} + +/* + * Handle SIGINT by restarting the parser (see octave.cc). + */ +static RETSIGTYPE +sigint_handler (int i) +{ + if (can_interrupt) + { + jump_to_top_level (); + panic_impossible (); + } + +#if RETSIGTYPE == void + return; +#else + return 0; +#endif +} + +static RETSIGTYPE +sigiot_handler (int i) +{ + my_friendly_exit ("SIGIOT", i); +} + +static RETSIGTYPE +siglost_handler (int i) +{ + my_friendly_exit ("SIGLOST", i); +} + +static RETSIGTYPE +sigpipe_handler (int i) +{ + if (pipe_handler_error_count++ == 0) + message ((char *) NULL, "broken pipe"); + +// Don\'t loop forever on account of this. + if (pipe_handler_error_count > 100) + jump_to_top_level (); + +#if RETSIGTYPE == void + return; +#else + return 0; +#endif +} + +static RETSIGTYPE +sigpoll_handler (int i) +{ + my_friendly_exit ("SIGPOLL", i); +} + +static RETSIGTYPE +sigprof_handler (int i) +{ + my_friendly_exit ("SIGPROF", i); +} + +static RETSIGTYPE +sigquit_handler (int i) +{ + my_friendly_exit ("SIGQUIT", i); +} + +static RETSIGTYPE +sigsegv_handler (int i) +{ + my_friendly_exit ("SIGSEGV", i); +} + +static RETSIGTYPE +sigsys_handler (int i) +{ + my_friendly_exit ("SIGSYS", i); +} + +static RETSIGTYPE +sigterm_handler (int i) +{ + my_friendly_exit ("SIGTERM", i); +} + +static RETSIGTYPE +sigtrap_handler (int i) +{ + my_friendly_exit ("SIGTRAP", i); +} + +static RETSIGTYPE +sigusr1_handler (int i) +{ + my_friendly_exit ("SIGUSR1", i); +} + +static RETSIGTYPE +sigusr2_handler (int i) +{ + my_friendly_exit ("SIGUSR2", i); +} + +static RETSIGTYPE +sigvtalrm_handler (int i) +{ + my_friendly_exit ("SIGVTALRM", i); +} + +static RETSIGTYPE +sigxcpu_handler (int i) +{ + my_friendly_exit ("SIGXCPU", i); +} + +static RETSIGTYPE +sigxfsz_handler (int i) +{ + my_friendly_exit ("SIGXFSZ", i); +} + +/* + * Install all the handlers for the signals we might care about. + */ +void +install_signal_handlers (void) +{ +#ifdef SIGABRT + signal (SIGABRT, sigabrt_handler); +#endif + +#ifdef SIGALRM + signal (SIGALRM, sigalrm_handler); +#endif + +#ifdef SIGBUS + signal (SIGBUS, sigbus_handler); +#endif + +#ifdef SIGEMT + signal (SIGEMT, sigemt_handler); +#endif + +#ifdef SIGFPE + signal (SIGFPE, sigfpe_handler); +#endif + +#ifdef SIGHUP + signal (SIGHUP, sighup_handler); +#endif + +#ifdef SIGILL + signal (SIGILL, sigill_handler); +#endif + +#ifdef SIGINT + signal (SIGINT, sigint_handler); +#endif + +#ifdef SIGIOT + signal (SIGIOT, sigiot_handler); +#endif + +#ifdef SIGLOST + signal (SIGLOST, siglost_handler); +#endif + +#ifdef SIGPIPE + signal (SIGPIPE, sigpipe_handler); +#endif + +#ifdef SIGPOLL + signal (SIGPOLL, sigpoll_handler); +#endif + +#ifdef SIGPROF + signal (SIGPROF, sigprof_handler); +#endif + +#ifdef SIGQUIT + signal (SIGQUIT, sigquit_handler); +#endif + +#ifdef SIGSEGV + signal (SIGSEGV, sigsegv_handler); +#endif + +#ifdef SIGSYS + signal (SIGSYS, sigsys_handler); +#endif + +#ifdef SIGTERM + signal (SIGTERM, sigterm_handler); +#endif + +#ifdef SIGTRAP + signal (SIGTRAP, sigtrap_handler); +#endif + +#ifdef SIGUSR1 + signal (SIGUSR1, sigusr1_handler); +#endif + +#ifdef SIGUSR2 + signal (SIGUSR2, sigusr2_handler); +#endif + +#ifdef SIGVTALRM + signal (SIGVTALRM, sigvtalrm_handler); +#endif + +#ifdef SIGXCPU + signal (SIGXCPU, sigxcpu_handler); +#endif + +#ifdef SIGXFSZ + signal (SIGXFSZ, sigxfsz_handler); +#endif +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; page-delimiter: "^/\\*" *** +;;; End: *** +*/