/[gcl]/gcl/o/usig2.c
ViewVC logotype

Diff of /gcl/o/usig2.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by camm, Fri May 17 04:23:15 2002 UTC revision 1.4 by camm, Sat Jul 20 07:10:56 2002 UTC
# Line 137  char safety_required[]={XX,XX,XX,XX,XX,X Line 137  char safety_required[]={XX,XX,XX,XX,XX,X
137                          XX,XX,XX,XX,XX,XX,XX,XX,                          XX,XX,XX,XX,XX,XX,XX,XX,
138                          XX,XX,XX,XX,XX,XX,XX,XX};                          XX,XX,XX,XX,XX,XX,XX,XX};
139    
140  int  void
141  init_safety()  init_safety(void)
142  { safety_required[SIGINT]=sig_try_to_delay;  { safety_required[SIGINT]=sig_try_to_delay;
143    safety_required[SIGALRM]=sig_normal;    safety_required[SIGALRM]=sig_normal;
144  }  }
145        
146  DO_INIT(init_safety();)  DO_INIT(init_safety();)
147  DEFUN("SIGNAL-SAFETY-REQUIRED",int,sSsignal_safety_required,SI,2,2,  DEFUN("SIGNAL-SAFETY-REQUIRED",object,sSsignal_safety_required,SI,2,2,
148        NONE,II,IO,OO,OO,        NONE,OI,IO,OO,OO,
149        "Set the safety level required for handling SIGNO to SAFETY, or if \        "Set the safety level required for handling SIGNO to SAFETY, or if \
150  SAFETY is negative just return the current safety level for that \  SAFETY is negative just return the current safety level for that \
151  signal number.  Value of 1 means allow interrupt at any place not \  signal number.  Value of 1 means allow interrupt at any place not \
# Line 158  only in very SAFE places.") Line 158  only in very SAFE places.")
158  { if (signo > sizeof(safety_required))  { if (signo > sizeof(safety_required))
159      {FEerror("Illegal signo:~a.",1,make_fixnum(signo));}      {FEerror("Illegal signo:~a.",1,make_fixnum(signo));}
160    if (safety >=0) safety_required[signo] = safety;    if (safety >=0) safety_required[signo] = safety;
161    return   safety_required[signo] ;    return make_fixnum(safety_required[signo]) ;
162  }  }
163            
164    
165  void  void
166  main_signal_handler(signo, a,b)  main_signal_handler(int signo, int a, int b)
      int signo,a,b;  
167  {  int allowed = signals_allowed;  {  int allowed = signals_allowed;
168  #ifdef NEED_TO_REINSTALL_SIGNALS  #ifdef NEED_TO_REINSTALL_SIGNALS
169         signal(signo,main_signal_handler);         signal(signo,main_signal_handler);
# Line 186  main_signal_handler(signo, a,b) Line 185  main_signal_handler(signo, a,b)
185    
186   }   }
187    
188  static void before_interrupt();  static void before_interrupt(struct save_for_interrupt *p, int allowed);
189  static void after_interrupt();  static void after_interrupt(struct save_for_interrupt *p, int allowed);
190    
191  /* caller saves and restores the global signals_allowed; */  /* caller saves and restores the global signals_allowed; */
192  invoke_handler(signo,allowed)  void
193       int signo,allowed;  invoke_handler(int signo, int allowed)
194  {struct save_for_interrupt buf;  {struct save_for_interrupt buf;
195   before_interrupt(&buf,allowed);   before_interrupt(&buf,allowed);
196   signals_pending &= ~(signal_mask(signo));   signals_pending &= ~(signal_mask(signo));
# Line 206  invoke_handler(signo,allowed) Line 205  invoke_handler(signo,allowed)
205    
206  int tok_leng;  int tok_leng;
207  static void  static void
208  before_interrupt(p,allowed)  before_interrupt(struct save_for_interrupt *p, int allowed)
    struct save_for_interrupt *p;  
      int allowed;  
209  {int i;  {int i;
210   /* all this must be run in no interrupts mode */   /* all this must be run in no interrupts mode */
211   if ( allowed < sig_safe)   if ( allowed < sig_safe)
# Line 264  before_interrupt(p,allowed) Line 261  before_interrupt(p,allowed)
261  }  }
262    
263  static void  static void
264  after_interrupt(p,allowed)  after_interrupt(struct save_for_interrupt *p, int allowed)
   struct save_for_interrupt *p;  
   int allowed;  
265  {int i;  {int i;
266   /* all this must be run in no interrupts mode */   /* all this must be run in no interrupts mode */
267   if ( allowed < sig_safe)   if ( allowed < sig_safe)
# Line 324  after_interrupt(p,allowed) Line 319  after_interrupt(p,allowed)
319  */  */
320    
321  object  object
322  MakeCons(a,b)  MakeCons(object a, object b)
      object a,b;  
323  { struct typemanager*ad = &tm_table[t_cons];  { struct typemanager*ad = &tm_table[t_cons];
324    object new = (object) ad->tm_free;    object new = (object) ad->tm_free;
325    if (new == 0)    if (new == 0)
# Line 371  MakeCons(a,b) Line 365  MakeCons(a,b)
365     Might be sig_safe (eg at cons). */     Might be sig_safe (eg at cons). */
366        
367  void  void
368  raise_pending_signals(cond)  raise_pending_signals(int cond)
      int cond;  
369  {unsigned int allowed = signals_allowed ;  {unsigned int allowed = signals_allowed ;
370   if (cond == sig_use_signals_allowed_value)   if (cond == sig_use_signals_allowed_value)
    { cond == allowed ;}  
371   if (cond == sig_none  || interrupt_enable ==0) return ;   if (cond == sig_none  || interrupt_enable ==0) return ;
372    
373    
# Line 385  raise_pending_signals(cond) Line 377  raise_pending_signals(cond)
377     if (pending)     if (pending)
378       while(*p)       while(*p)
379         { if (signal_mask(*p) & pending         { if (signal_mask(*p) & pending
380               && cond >= safety_required[*p])               && cond >= safety_required[(unsigned char)*p])
381             {             {
382               signals_pending &= ~(signal_mask(*p));               signals_pending &= ~(signal_mask(*p));
383               if (*p == SIGALRM && cond >= sig_safe)               if (*p == SIGALRM && cond >= sig_safe)
# Line 401  raise_pending_signals(cond) Line 393  raise_pending_signals(cond)
393   }}   }}
394    
395    
396  DEFUN("ALLOW-SIGNAL",int,fSallow_signal,SI,1,1,NONE,II,OO,OO,OO,  DEFUN("ALLOW-SIGNAL",object,fSallow_signal,SI,1,1,NONE,OI,OO,OO,OO,
397        "Install the default signal handler on signal N")        "Install the default signal handler on signal N")
398       (n)       (n)
399       int n;       int n;
400  {int ma ;  {
401   int ans = 0;  
402   signals_allowed |= signal_mask(n);   signals_allowed |= signal_mask(n);
403   unblock_signals(n,n);   unblock_signals(n,n);
404   /* sys v ?? just restore the signal ?? */   /* sys v ?? just restore the signal ?? */
405   if (our_signal_handler[n])   if (our_signal_handler[n])
406     {gcl_signal(n,our_signal_handler[n]);     {gcl_signal(n,our_signal_handler[n]);
407      return 1;      return make_fixnum(1);
408    }    }
409   else   else
410     return 0;     return make_fixnum(0);
411  }  }
412    
413    

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26