Diff for /gforth/engine/signals.c between versions 1.36 and 1.51

version 1.36, 2007/04/01 13:31:26 version 1.51, 2012/07/20 19:34:27
Line 1 Line 1
 /* signal handling  /* signal handling
   
   Copyright (C) 1995,1996,1997,1998,2000,2003,2006 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;  PER_THREAD jmp_buf * throw_jmp_handler;
   
 void throw(int code)  void throw(int code)
 {  {
   longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */    debugp(stderr,"\nthrow code %d to %p\n", code, *throw_jmp_handler);
     longjmp(*throw_jmp_handler,code); /* !! or use siglongjmp ? */
 }  }
   
 static void   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 %p %p\n", sig, info, _);
   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 179  static void fpe_handler(int sig, siginfo Line 192  static void fpe_handler(int sig, siginfo
 #define JUSTOVER(addr1,addr2) (((UCell)((addr1)-(addr2)))<SPILLAGE)  #define JUSTOVER(addr1,addr2) (((UCell)((addr1)-(addr2)))<SPILLAGE)
   
 #define NEXTPAGE(addr) ((Address)((((UCell)(addr)-1)&-pagesize)+pagesize))  #define NEXTPAGE(addr) ((Address)((((UCell)(addr)-1)&-pagesize)+pagesize))
   #define NEXTPAGE2(addr) ((Address)((((UCell)(addr)-1)&-pagesize)+2*pagesize))
   #define NEXTPAGE3(addr) ((Address)((((UCell)(addr)-1)&-pagesize)+3*pagesize))
   
 static void segv_handler(int sig, siginfo_t *info, void *_)  static void segv_handler(int sig, siginfo_t *info, void *_)
 {  {
   int code=-9;    int code=-9;
   Address addr=info->si_addr;    Address addr=info->si_addr;
   ImageHeader *h=gforth_header;  
   
   if (JUSTUNDER(addr, h->data_stack_base))    debugp(stderr,"\nsegv_handler %d %p %p @%p\n", sig, info, _, addr);
   
     if (JUSTUNDER(addr, NEXTPAGE3(gforth_UP)))
     code=-3;      code=-3;
   else if (JUSTOVER(addr, NEXTPAGE(h->data_stack_base+h->data_stack_size)))    else if (JUSTOVER(addr, NEXTPAGE(gforth_UP->sp0)))
     code=-4;      code=-4;
   else if (JUSTUNDER(addr, h->return_stack_base))    else if (JUSTUNDER(addr, NEXTPAGE2(gforth_UP->sp0)))
     code=-5;      code=-5;
   else if (JUSTOVER(addr, NEXTPAGE(h->return_stack_base+h->return_stack_size)))    else if (JUSTOVER(addr, NEXTPAGE(gforth_UP->rp0)))
     code=-6;      code=-6;
   else if (JUSTUNDER(addr, h->fp_stack_base))    else if (JUSTUNDER(addr, NEXTPAGE2(gforth_UP->rp0)))
     code=-44;      code=-44;
   else if (JUSTOVER(addr, NEXTPAGE(h->fp_stack_base+h->fp_stack_size)))    else if (JUSTOVER(addr, NEXTPAGE(gforth_UP->fp0)))
     code=-45;      code=-45;
   throw(code);    throw(code);
 }  }
Line 232  void get_winsize() Line 248  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 401  void install_signal_handlers(void) Line 417  void install_signal_handlers(void)
   };    };
   int i;    int i;
   void (*throw_handler)() = die_on_signal ? graceful_exit : signal_throw;    void (*throw_handler)() = die_on_signal ? graceful_exit : signal_throw;
 #ifdef SIGSTKSZ   #if 0
     /* sigaltstack is now called by gforth_stacks() */
   #if defined(SIGSTKSZ)
   stack_t sigstack;    stack_t sigstack;
   int sas_retval=-1;    int sas_retval=-1;
   
Line 416  void install_signal_handlers(void) Line 434  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  #endif
   

Removed from v.1.36  
changed lines
  Added in v.1.51


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