Diff for /gforth/engine/signals.c between versions 1.43 and 1.47

version 1.43, 2012/03/16 20:34:23 version 1.47, 2012/03/23 21:48:06
Line 34 Line 34
 #include <termios.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);
 }  }
   
 __thread jmp_buf throw_jmp_buf;  __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 0x%p 0x%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 185  static void segv_handler(int sig, siginf Line 199  static void segv_handler(int sig, siginf
   Address addr=info->si_addr;    Address addr=info->si_addr;
   ImageHeader *h=gforth_header;    ImageHeader *h=gforth_header;
   
     debugp(stderr,"\nsegv_handler %d 0x%p 0x%p\n", sig, info, _);
   
   if (JUSTUNDER(addr, h->data_stack_base))    if (JUSTUNDER(addr, h->data_stack_base))
     code=-3;      code=-3;
   else if (JUSTOVER(addr, NEXTPAGE(h->data_stack_base+h->data_stack_size)))    else if (JUSTOVER(addr, NEXTPAGE(h->data_stack_base+h->data_stack_size)))
Line 415  void install_signal_handlers(void) Line 431  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
   

Removed from v.1.43  
changed lines
  Added in v.1.47


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