#include <stdio.h>
#include <stdlib.h>
-
+#include <string.h>
#include <signal.h>
-#ifdef mach /* KLUDGE: #ifdef on lowercase symbols? Ick. -- WHN 19990904 */
-#ifdef mips
-#include <mips/cpu.h>
-#endif
-#endif
#include "runtime.h"
#include "arch.h"
#include "dynbind.h"
#include "interr.h"
+
void sigaddset_blockable(sigset_t *s)
{
sigaddset(s, SIGHUP);
sigaddset(s, SIGPIPE);
sigaddset(s, SIGALRM);
sigaddset(s, SIGURG);
+ sigaddset(s, SIGFPE);
sigaddset(s, SIGTSTP);
sigaddset(s, SIGCHLD);
sigaddset(s, SIGIO);
== current_control_frame_pointer) {
/* There is a small window during call where the callee's
* frame isn't built yet. */
- if (lowtagof(*os_context_register_addr(context, reg_CODE))
+ if (lowtag_of(*os_context_register_addr(context, reg_CODE))
== FUN_POINTER_LOWTAG) {
/* We have called, but not built the new frame, so
* build it for them. */
* anyway. Why we still need to copy the pending_mask into the
* context given that we're now done with the context anyway, I
* couldn't say. */
- memcpy(os_context_sigmask_addr(context), &pending_mask, sizeof(sigset_t));
+#if 0
+ memcpy(os_context_sigmask_addr(context), &pending_mask,
+ 4 /* sizeof(sigset_t) */ );
+#endif
sigemptyset(&pending_mask);
if (pending_signal) {
int signal = pending_signal;
if (ARE_SAME_HANDLER(handler.c, SIG_IGN)) {
return;
}
-
+
#ifndef __i386__
were_in_lisp = !foreign_function_call_active;
if (were_in_lisp)
* support decides to pass on it. */
lose("no handler for signal %d in interrupt_handle_now(..)", signal);
- } else if (lowtagof(handler.lisp) == FUN_POINTER_LOWTAG) {
+ } else if (lowtag_of(handler.lisp) == FUN_POINTER_LOWTAG) {
/* Allocate the SAPs while the interrupts are still disabled.
* (FIXME: Why? This is the way it was done in CMU CL, and it
arch_set_pseudo_atomic_interrupted(context);
}
else {
+ lispobj *old_free_space=current_dynamic_space;
fake_foreign_function_call(context);
funcall0(SymbolFunction(MAYBE_GC));
undo_fake_foreign_function_call(context);
- }
-
+ if(current_dynamic_space==old_free_space)
+ /* MAYBE-GC (as the name suggest) might not. If it
+ * doesn't, it won't reset the GC trigger either, so we
+ * have to do it ourselves. Add small amount of space
+ * to tide us over while GC is inhibited
+ */
+ set_auto_gc_trigger((u32)dynamic_space_free_pointer
+ -(u32)current_dynamic_space
+ +(u32)os_vm_page_size);
+ }
return 1;
} else {
return 0;