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 \ |
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); |
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)); |
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) |
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) |
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) |
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 |
|
|
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) |
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 |
|
|