Diff for /gforth/engine/signals.c between versions 1.38 and 1.45

version 1.38, 2007/12/31 17:34:59 version 1.45, 2012/03/23 19:53:37
Line 1 Line 1
 /* signal handling  /* signal handling
   
   Copyright (C) 1995,1996,1997,1998,2000,2003,2006,2007 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998,2000,2003,2006,2007,2011 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
   Gforth is free software; you can redistribute it and/or    Gforth is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License    modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; either version 2    as published by the Free Software Foundation, either version 3
   of the License, or (at your option) any later version.    of the License, or (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,    This program is distributed in the hope that it will be useful,
Line 15 Line 15
   GNU General Public License for more details.    GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License    You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software    along with this program; if not, see http://www.gnu.org/licenses/.
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.  
   
 */  */
   
Line 30 Line 29
 #if !defined(apollo) && !defined(MSDOS)  #if !defined(apollo) && !defined(MSDOS)
 #include <sys/ioctl.h>  #include <sys/ioctl.h>
 #endif  #endif
 /* #include <asm/signal.h> */  
 #include <sys/types.h>  #include <sys/types.h>
 #include <signal.h>  #include <signal.h>
   #include <termios.h>
 #include "io.h"  #include "io.h"
   
   #ifdef HAS_DEBUG
   extern int debug;
   # define debugp(x...) do { if (debug) fprintf(x); } while (0)
   #else
   # define perror(x...)
   # define fprintf(x...)
   # define debugp(x...)
   #endif
   
 #ifndef HAVE_STACK_T  #ifndef HAVE_STACK_T
 /* Darwin uses "struct sigaltstack" instead of "stack_t" */  /* Darwin uses "struct sigaltstack" instead of "stack_t" */
 typedef struct sigaltstack stack_t;  typedef struct sigaltstack stack_t;
Line 93  graceful_exit (int sig) Line 101  graceful_exit (int sig)
   exit (0x80|sig);    exit (0x80|sig);
 }  }
   
 jmp_buf throw_jmp_buf;  __thread jmp_buf throw_jmp_buf;
   
 void throw(int code)  void throw(int code)
 {  {
     debugp(stderr,"\nthrow code %d to %lx\n", code, (intptr_t)throw_jmp_buf);
   longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */    longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */
 }  }
   
Line 104  static void Line 113  static void
 signal_throw(int sig)  signal_throw(int sig)
 {  {
   int code;    int code;
     debugp(stderr,"\ncaught signal %d\n", sig);
   
   switch (sig) {    switch (sig) {
   case SIGINT: code=-28; break;    case SIGINT: code=-28; break;
Line 132  signal_throw(int sig) Line 142  signal_throw(int sig)
 static void  static void
 sigaction_throw(int sig, siginfo_t *info, void *_)  sigaction_throw(int sig, siginfo_t *info, void *_)
 {  {
     debugp(stderr,"\nsigaction_throw %d 0x%lx 0x%lx\n", sig, (intptr_t)info, (intptr_t)_);
   signal_throw(sig);    signal_throw(sig);
 }  }
   
Line 140  static void fpe_handler(int sig, siginfo Line 151  static void fpe_handler(int sig, siginfo
 {  {
   int code;    int code;
   
     debugp(stderr,"\nfpe_handler %d %x %x\n", sig, info, _);
   
   switch(info->si_code) {    switch(info->si_code) {
 #ifdef FPE_INTDIV  #ifdef FPE_INTDIV
   case FPE_INTDIV: code=BALL_DIVZERO; break;    case FPE_INTDIV: code=BALL_DIVZERO; break;
Line 186  static void segv_handler(int sig, siginf Line 199  static void segv_handler(int sig, siginf
   Address addr=info->si_addr;    Address addr=info->si_addr;
   ImageHeader *h=gforth_header;    ImageHeader *h=gforth_header;
   
     debugp(stderr,"\nsegv_handler %d 0x%lx 0x%lx\n", sig, (intptr_t)info, (intptr_t)_);
   
   if (JUSTUNDER(addr, h->data_stack_base))    if (JUSTUNDER(addr, h->data_stack_base))
     code=-3;      code=-3;
   else if (JUSTOVER(addr, NEXTPAGE(h->data_stack_base+h->data_stack_size)))    else if (JUSTOVER(addr, NEXTPAGE(h->data_stack_base+h->data_stack_size)))
Line 416  void install_signal_handlers(void) Line 431  void install_signal_handlers(void)
     sas_retval=sigaltstack(&sigstack,(stack_t *)0);      sas_retval=sigaltstack(&sigstack,(stack_t *)0);
   }    }
 #if defined(HAS_FILE) || !defined(STANDALONE)  #if defined(HAS_FILE) || !defined(STANDALONE)
   if (debug)    debugp(stderr,"sigaltstack: %s\n",strerror(sas_retval));
     fprintf(stderr,"sigaltstack: %s\n",strerror(sas_retval));  
 #endif  #endif
 #endif  #endif
   

Removed from v.1.38  
changed lines
  Added in v.1.45


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>