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

version 1.46, 2012/03/23 20:49:44 version 1.51, 2012/07/20 19:34:27
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.51


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