diff --git a/ldb/interrupt.c b/ldb/interrupt.c index b572d368414fac480b4f6a3001cafd2a865881c1..88d7d7ff49cbc69c7c7d3c5bf5774274898cebd4 100644 --- a/ldb/interrupt.c +++ b/ldb/interrupt.c @@ -1,4 +1,4 @@ -/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/interrupt.c,v 1.16 1990/11/27 10:05:06 wlott Exp $ */ +/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/interrupt.c,v 1.17 1990/11/28 17:14:26 wlott Exp $ */ /* Interrupt handing magic. */ @@ -16,6 +16,8 @@ #define crap_out(msg) do { write(2, msg, sizeof(msg)); abort(); } while (0) +boolean internal_errors_enabled = 0; + struct sigcontext *lisp_interrupt_contexts[MAX_INTERRUPTS]; union interrupt_handler interrupt_handlers[NSIG]; @@ -122,12 +124,17 @@ struct sigcontext *context; handler = interrupt_handlers[signal]; were_in_lisp = !foreign_function_call_active; + if (handler.c == SIG_DFL || handler.c == SIG_IGN) + /* This can happen if someone tries to ignore or default on of the */ + /* signals we need for runtime support. */ + return; + if (were_in_lisp) fake_foreign_function_call(context); /* Allow signals again. */ sigsetmask(context->sc_mask); - + if (LowtagOf(handler.lisp) == type_EvenFixnum || LowtagOf(handler.lisp) == type_OddFixnum) (*handler.c)(signal, code, context); @@ -246,26 +253,36 @@ struct sigcontext *context; crap_out("%primitive halt called; the party is over.\n"); case trap_Error: - sigsetmask(context->sc_mask); - fake_foreign_function_call(context); - args = current_control_stack_pointer; - current_control_stack_pointer += 2; - args[0] = alloc_sap(context); - args[1] = NIL; - call_into_lisp(INTERNAL_ERROR,SymbolFunction(INTERNAL_ERROR),args,2); - undo_fake_foreign_function_call(context); + if (internal_errors_enabled) { + sigsetmask(context->sc_mask); + fake_foreign_function_call(context); + args = current_control_stack_pointer; + current_control_stack_pointer += 2; + args[0] = alloc_sap(context); + args[1] = NIL; + call_into_lisp(INTERNAL_ERROR, SymbolFunction(INTERNAL_ERROR), + args, 2); + undo_fake_foreign_function_call(context); + } + else + handle_now(signal, code, context); break; case trap_Cerror: - sigsetmask(context->sc_mask); - fake_foreign_function_call(context); - args = current_control_stack_pointer; - current_control_stack_pointer += 2; - args[0] = alloc_sap(context); - args[1] = T; - call_into_lisp(INTERNAL_ERROR,SymbolFunction(INTERNAL_ERROR),args,2); - undo_fake_foreign_function_call(context); - skip_instruction(context); + if (internal_errors_enabled) { + sigsetmask(context->sc_mask); + fake_foreign_function_call(context); + args = current_control_stack_pointer; + current_control_stack_pointer += 2; + args[0] = alloc_sap(context); + args[1] = T; + call_into_lisp(INTERNAL_ERROR, SymbolFunction(INTERNAL_ERROR), + args, 2); + undo_fake_foreign_function_call(context); + skip_instruction(context); + } + else + handle_now(signal, code, context); break; default: