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

version 1.23, 2003/02/01 14:28:07 version 1.29, 2006/01/05 01:37:33
Line 1 Line 1
 /* signal handling  /* signal handling
   
   Copyright (C) 1995,1996,1997,1998,2000 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 378  void install_signal_handlers(void) Line 401  void install_signal_handlers(void)
      SUSv2 ss_sp should point to the start of the stack, but       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       unfortunately Irix 6.5 (at least) expects ss_sp to point to the
      end, so we work around this issue by accomodating everyone. */       end, so we work around this issue by accomodating everyone. */
   if ((sigstack.ss_sp = my_alloc(sigstack.ss_size*2)) != NULL) {    if ((sigstack.ss_sp = gforth_alloc(sigstack.ss_size*2)) != NULL) {
     sigstack.ss_sp += sigstack.ss_size;      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 398  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.23  
changed lines
  Added in v.1.29


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