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

version 1.29, 2006/01/05 01:37:33 version 1.38, 2007/12/31 17:34:59
Line 1 Line 1
 /* signal handling  /* signal handling
   
   Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998,2000,2003,2006,2007 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
Line 41  typedef struct sigaltstack stack_t; Line 41  typedef struct sigaltstack stack_t;
 #endif  #endif
   
 #define DEFAULTCOLS 80  #define DEFAULTCOLS 80
 #if defined(MSDOS) || defined (_WIN32)  #if defined(MSDOS) || defined (_WIN32) || defined (__CYGWIN__)
 #define DEFAULTROWS 25  #define DEFAULTROWS 25
 #else  #else
 #define DEFAULTROWS 24  #define DEFAULTROWS 24
Line 95  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 120  signal_throw(int sig) Line 125  signal_throw(int sig)
     sigprocmask(SIG_SETMASK, &emptyset, NULL);      sigprocmask(SIG_SETMASK, &emptyset, NULL);
   }    }
 #endif  #endif
   longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */    throw(code);
 }  }
   
 #ifdef SA_SIGINFO  #ifdef SA_SIGINFO
Line 137  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  #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 */
Line 160  static void fpe_handler(int sig, siginfo Line 165  static void fpe_handler(int sig, siginfo
 #endif  #endif
   default: code=-55; break;    default: code=-55; break;
   }    }
   longjmp(throw_jmp_buf,code);    throw(code);
 }  }
   
   
Line 193  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 227  void get_winsize() Line 232  void get_winsize()
 #endif  #endif
   if (rows==0)    if (rows==0)
     rows=DEFAULTROWS;      rows=DEFAULTROWS;
   if (rows==0)    if (cols==0)
     cols=DEFAULTCOLS;      cols=DEFAULTCOLS;
 }  }
   
Line 314  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 336  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 357  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 406  void install_signal_handlers(void) Line 415  void install_signal_handlers(void)
     sigstack.ss_flags=0;      sigstack.ss_flags=0;
     sas_retval=sigaltstack(&sigstack,(stack_t *)0);      sas_retval=sigaltstack(&sigstack,(stack_t *)0);
   }    }
   #if defined(HAS_FILE) || !defined(STANDALONE)
   if (debug)    if (debug)
     fprintf(stderr,"sigaltstack: %s\n",strerror(sas_retval));      fprintf(stderr,"sigaltstack: %s\n",strerror(sas_retval));
 #endif  #endif
   #endif
   
 #define DIM(X)          (sizeof (X) / sizeof *(X))  #define DIM(X)          (sizeof (X) / sizeof *(X))
 /*  /*
Line 417  void install_signal_handlers(void) Line 428  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

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


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