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

version 1.21, 2003/01/19 23:35:34 version 1.32, 2006/10/22 16:54:01
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 97  graceful_exit (int sig) Line 95  graceful_exit (int sig)
   
 jmp_buf throw_jmp_buf;  jmp_buf throw_jmp_buf;
   
   void throw(int code)
   {
     longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */
   }
   
 static void   static void 
 signal_throw(int sig)  signal_throw(int sig)
 {  {
Line 109  signal_throw(int sig) Line 112  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;
   }    }
   longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */  #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
     throw(code);
 }  }
   
 #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 122  static void fpe_handler(int sig, siginfo Line 142  static void fpe_handler(int sig, siginfo
   
   switch(info->si_code) {    switch(info->si_code) {
 #ifdef FPE_INTDIV  #ifdef FPE_INTDIV
   case FPE_INTDIV: code=-10; break; /* integer divide by zero */    case FPE_INTDIV: code=BALL_DIVZERO; break;
 #endif  #endif
 #ifdef FPE_INTOVF  #ifdef FPE_INTOVF
   case FPE_INTOVF: code=-11; break; /* integer overflow */    case FPE_INTOVF: code=BALL_RESULTRANGE; 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  */
 #endif  #endif
   default: code=-55; break;    default: code=-55; break;
   }    }
   longjmp(throw_jmp_buf,code);    throw(code);
 }  }
   
   
Line 170  static void segv_handler(int sig, siginf Line 198  static void segv_handler(int sig, siginf
     code=-44;      code=-44;
   else if (JUSTOVER(addr, NEXTPAGE(h->fp_stack_base+h->fp_stack_size)))    else if (JUSTOVER(addr, NEXTPAGE(h->fp_stack_base+h->fp_stack_size)))
     code=-45;      code=-45;
   longjmp(throw_jmp_buf,code);    throw(code);
 }  }
   
 #endif /* defined(SA_SIGINFO) */  #endif /* defined(SA_SIGINFO) */
Line 291  void install_signal_handlers(void) Line 319  void install_signal_handlers(void)
   };    };
 #endif  #endif
   
     static short async_sigs_to_throw [] = {
   #ifdef SIGINT
       SIGINT,
   #endif
   #ifdef SIGALRM
       SIGALRM,
   #endif
   #ifdef SIGPOLL
       SIGPOLL,
   #endif
   #ifdef SIGPROF
       SIGPROF,
   #endif
   #ifdef SIGURG
       SIGURG,
   #endif
   #ifdef SIGPIPE
       SIGPIPE,
   #endif
   #ifdef SIGUSR1
       SIGUSR1,
   #endif
   #ifdef SIGUSR2
       SIGUSR2,
   #endif
   #ifdef SIGVTALRM
       SIGVTALRM,
   #endif
   #ifdef SIGXFSZ
       SIGXFSZ,
   #endif
     };
   
   static short sigs_to_throw [] = {    static short sigs_to_throw [] = {
 #ifdef SIGBREAK  #ifdef SIGBREAK
     SIGBREAK,      SIGBREAK,
 #endif  #endif
 #ifdef SIGINT  
     SIGINT,  
 #endif  
 #ifdef SIGILL  #ifdef SIGILL
     SIGILL,      SIGILL,
 #endif  #endif
Line 313  void install_signal_handlers(void) Line 371  void install_signal_handlers(void)
 #ifdef SIGSEGV  #ifdef SIGSEGV
     SIGSEGV,      SIGSEGV,
 #endif  #endif
 #ifdef SIGALRM  
     SIGALRM,  
 #endif  
 #ifdef SIGPIPE  
     SIGPIPE,  
 #endif  
 #ifdef SIGPOLL  
     SIGPOLL,  
 #endif  
 #ifdef SIGPROF  
     SIGPROF,  
 #endif  
 #ifdef SIGBUS  #ifdef SIGBUS
     SIGBUS,      SIGBUS,
 #endif  #endif
Line 334  void install_signal_handlers(void) Line 380  void install_signal_handlers(void)
 #ifdef SIGTRAP  #ifdef SIGTRAP
     SIGTRAP,      SIGTRAP,
 #endif  #endif
 #ifdef SIGURG  
     SIGURG,  
 #endif  
 #ifdef SIGUSR1  
     SIGUSR1,  
 #endif  
 #ifdef SIGUSR2  
     SIGUSR2,  
 #endif  
 #ifdef SIGVTALRM  
     SIGVTALRM,  
 #endif  
 #ifdef SIGXFSZ  
     SIGXFSZ,  
 #endif  
   };    };
   
   static short sigs_to_quit [] = {    static short sigs_to_quit [] = {
 #ifdef SIGQUIT  #ifdef SIGQUIT
     SIGQUIT,      SIGQUIT,
Line 374  void install_signal_handlers(void) Line 406  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 389  void install_signal_handlers(void) Line 426  void install_signal_handlers(void)
 */  */
   for (i = 0; i < DIM (sigs_to_throw); i++)    for (i = 0; i < DIM (sigs_to_throw); i++)
     bsd_signal(sigs_to_throw[i], throw_handler);      bsd_signal(sigs_to_throw[i], throw_handler);
     for (i = 0; i < DIM (async_sigs_to_throw); i++)
       bsd_signal(async_sigs_to_throw[i], 
                  ignore_async_signals ? SIG_IGN : throw_handler);
   for (i = 0; i < DIM (sigs_to_quit); i++)    for (i = 0; i < DIM (sigs_to_quit); i++)
     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.32


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