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

version 1.39, 2007/12/31 18:40:25 version 1.44, 2012/03/23 19:32:25
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 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;  __thread jmp_buf throw_jmp_buf;
   
 void throw(int code)  void throw(int code)
 {  {
     debugp(stderr,"\nthrow code %d\n", code);
   longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */    longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */
 }  }
   
Line 103  static void Line 113  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 %x %x\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 %x %x\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.39  
changed lines
  Added in v.1.44


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