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

version 1.46, 2012/03/23 20:49:44 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,2011 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 101  graceful_exit (int sig) Line 101  graceful_exit (int sig)
   exit (0x80|sig);    exit (0x80|sig);
 }  }
   
 __thread jmp_buf * throw_jmp_handler;  PER_THREAD jmp_buf * throw_jmp_handler;
   
 void throw(int code)  void throw(int code)
 {  {
   debugp(stderr,"\nthrow code %d to %lx\n", code, (intptr_t)*throw_jmp_handler);    debugp(stderr,"\nthrow code %d to %p\n", code, *throw_jmp_handler);
   longjmp(*throw_jmp_handler,code); /* !! or use siglongjmp ? */    longjmp(*throw_jmp_handler,code); /* !! or use siglongjmp ? */
 }  }
   
Line 142  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 0x%lx 0x%lx\n", sig, (intptr_t)info, (intptr_t)_);    debugp(stderr,"\nsigaction_throw %d %p %p\n", sig, info, _);
   signal_throw(sig);    signal_throw(sig);
 }  }
   
Line 192  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;  
   
   debugp(stderr,"\nsegv_handler %d 0x%lx 0x%lx\n", sig, (intptr_t)info, (intptr_t)_);    debugp(stderr,"\nsegv_handler %d %p %p @%p\n", sig, info, _, addr);
   
   if (JUSTUNDER(addr, h->data_stack_base))    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 416  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 434  void install_signal_handlers(void) Line 437  void install_signal_handlers(void)
   debugp(stderr,"sigaltstack: %s\n",strerror(sas_retval));    debugp(stderr,"sigaltstack: %s\n",strerror(sas_retval));
 #endif  #endif
 #endif  #endif
   #endif
   
 #define DIM(X)          (sizeof (X) / sizeof *(X))  #define DIM(X)          (sizeof (X) / sizeof *(X))
 /*  /*

Removed from v.1.46  
changed lines
  Added in v.1.52


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