Diff for /gforth/engine/signals.c between versions 1.39 and 1.52

version 1.39, 2007/12/31 18:40:25 version 1.52, 2012/12/31 15:25:19
Line 1 Line 1
 /* signal handling  /* signal handling
   
   Copyright (C) 1995,1996,1997,1998,2000,2003,2006,2007 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998,2000,2003,2006,2007,2011,2012 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
Line 29 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 92  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 131  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 139  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 178  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 400  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 415  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.39  
changed lines
  Added in v.1.52


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