diff --git a/ldb/interrupt.c b/ldb/interrupt.c index 86573850fc615193ef9d7109c1ea7a23b60e2f5f..6c38c3f7956d0e7fb58ff9aa6f761f70fb182d07 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.32 1992/03/08 18:42:36 wlott Exp $ */ +/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/interrupt.c,v 1.33 1992/03/22 19:57:46 wlott Exp $ */ /* Interrupt handing magic. */ @@ -163,8 +163,16 @@ void interrupt_handle_pending(context) #ifdef mips context->sc_regs[FLAGS] &= ~(1<<flag_Interrupted); +#else +#ifdef sparc + /* Bit 0 is the pseudo-atomic-interrupted flag, and bit 2 is the + pseudo-atomic-atomic flag. Normally, p-a-a is cleared before + we get control, but sometimes (assembly/sparc/bit-bash.lisp) + it is not. So we clear them both here. */ + context->sc_regs[ALLOC] &= ~5; #else SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, 0); +#endif #endif SetSymbolValue(INTERRUPT_PENDING, NIL); if (maybe_gc_pending) { @@ -251,9 +259,13 @@ struct sigcontext *context; } else if ((!foreign_function_call_active) #ifdef mips && (context->sc_regs[FLAGS] & (1<<flag_Atomic)) +#else +#ifdef sparc + && (context->sc_regs[ALLOC] & 4) #else && (SymbolValue(PSEUDO_ATOMIC_ATOMIC)) -#endif +#endif +#endif ) { pending_signal = signal; pending_code = code; @@ -261,8 +273,12 @@ struct sigcontext *context; context->sc_mask |= BLOCKABLE; #ifdef mips context->sc_regs[FLAGS] |= (1<<flag_Interrupted); +#else +#ifdef sparc + context->sc_regs[ALLOC] |= 1; #else SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, T); +#endif #endif } else interrupt_handle_now(signal, code, context);