Diff for /gforth/engine/signals.c between versions 1.21 and 1.29

version 1.21, 2003/01/19 23:35:34 version 1.29, 2006/01/05 01:37:33
Line 1 Line 1
 /* signal handling  /* signal handling
   
   Copyright (C) 1995-2003 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
Line 72  void install_signal_handler(int sig, voi Line 72  void install_signal_handler(int sig, voi
 }  }
 #endif  #endif
   
 typedef void Sigfunc(int);  
   
 Sigfunc *bsd_signal(int signo, Sigfunc *func)  Sigfunc *bsd_signal(int signo, Sigfunc *func)
 {  {
   struct sigaction act, oact;    struct sigaction act, oact;
Line 109  signal_throw(int sig) Line 107  signal_throw(int sig)
   case SIGBUS: code=-23; break;    case SIGBUS: code=-23; break;
 #endif  #endif
   case SIGSEGV: code=-9; break;    case SIGSEGV: code=-9; break;
   #ifdef SIGPIPE
     case SIGPIPE: code=-2049; break;
   #endif
   default: code=-256-sig; break;    default: code=-256-sig; break;
   }    }
   #ifdef __CYGWIN__
     /* the SA_NODEFER apparently does not work on Cygwin 1.3.18(0.69/3/2) */
     {
       sigset_t emptyset;
       sigemptyset(&emptyset);
       sigprocmask(SIG_SETMASK, &emptyset, NULL);
     }
   #endif
   longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */    longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */
 }  }
   
 #ifdef SA_SIGINFO  #ifdef SA_SIGINFO
   static void
   sigaction_throw(int sig, siginfo_t *info, void *_)
   {
     signal_throw(sig);
   }
   
 static void fpe_handler(int sig, siginfo_t *info, void *_)  static void fpe_handler(int sig, siginfo_t *info, void *_)
      /* handler for SIGFPE */       /* handler for SIGFPE */
 {  {
Line 127  static void fpe_handler(int sig, siginfo Line 142  static void fpe_handler(int sig, siginfo
 #ifdef FPE_INTOVF  #ifdef FPE_INTOVF
   case FPE_INTOVF: code=-11; break; /* integer overflow */    case FPE_INTOVF: code=-11; break; /* integer overflow */
 #endif  #endif
   #ifdef FPE_FLTDIV
   case FPE_FLTDIV: code=-42; break; /* floating point divide by zero */    case FPE_FLTDIV: code=-42; break; /* floating point divide by zero */
   #endif
   #ifdef FPE_FLTOVF
   case FPE_FLTOVF: code=-43; break; /* floating point overflow  */    case FPE_FLTOVF: code=-43; break; /* floating point overflow  */
   #endif
   #ifdef FPE_FLTUND
   case FPE_FLTUND: code=-54; break; /* floating point underflow  */    case FPE_FLTUND: code=-54; break; /* floating point underflow  */
   #endif
   #ifdef FPE_FLTRES
   case FPE_FLTRES: code=-41; break; /* floating point inexact result  */    case FPE_FLTRES: code=-41; break; /* floating point inexact result  */
   #endif
 #if 0 /* defined by Unix95, but unnecessary */  #if 0 /* defined by Unix95, but unnecessary */
   case FPE_FLTINV: /* invalid floating point operation  */    case FPE_FLTINV: /* invalid floating point operation  */
   case FPE_FLTSUB: /* subscript out of range  */    case FPE_FLTSUB: /* subscript out of range  */
Line 374  void install_signal_handlers(void) Line 397  void install_signal_handlers(void)
   int sas_retval=-1;    int sas_retval=-1;
   
   sigstack.ss_size=SIGSTKSZ;    sigstack.ss_size=SIGSTKSZ;
   if ((sigstack.ss_sp = my_alloc(sigstack.ss_size)) != NULL) {    /* Actually the stack should only be ss_size large, and according to
        SUSv2 ss_sp should point to the start of the stack, but
        unfortunately Irix 6.5 (at least) expects ss_sp to point to the
        end, so we work around this issue by accomodating everyone. */
     if ((sigstack.ss_sp = gforth_alloc(sigstack.ss_size*2)) != NULL) {
       sigstack.ss_sp += sigstack.ss_size;
     sigstack.ss_flags=0;      sigstack.ss_flags=0;
     sas_retval=sigaltstack(&sigstack,(stack_t *)0);      sas_retval=sigaltstack(&sigstack,(stack_t *)0);
   }    }
Line 393  void install_signal_handlers(void) Line 421  void install_signal_handlers(void)
     bsd_signal(sigs_to_quit [i], graceful_exit);      bsd_signal(sigs_to_quit [i], graceful_exit);
 #ifdef SA_SIGINFO  #ifdef SA_SIGINFO
   if (!die_on_signal) {    if (!die_on_signal) {
   #ifdef SIGFPE
     install_signal_handler(SIGFPE, fpe_handler);      install_signal_handler(SIGFPE, fpe_handler);
   #endif
   #ifdef SIGSEGV
     install_signal_handler(SIGSEGV, segv_handler);      install_signal_handler(SIGSEGV, segv_handler);
   }  
 #endif  #endif
       /* use SA_ONSTACK for all signals that could come from executing
          wrong code */
   #ifdef SIGILL
       install_signal_handler(SIGILL, sigaction_throw);
   #endif
   #ifdef SIGBUS
       install_signal_handler(SIGBUS, sigaction_throw);
   #endif
   #ifdef SIGTRAP
       install_signal_handler(SIGTRAP, sigaction_throw);
   #endif
     }
   #endif /* defined(SA_SIGINFO) */
 #ifdef SIGCONT  #ifdef SIGCONT
     bsd_signal(SIGCONT, termprep);      bsd_signal(SIGCONT, termprep);
 #endif  #endif

Removed from v.1.21  
changed lines
  Added in v.1.29


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