0.pre7.56:
[sbcl.git] / src / runtime / interrupt.c
index cb5fcaf..24538f9 100644 (file)
@@ -14,6 +14,7 @@
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 
 #include <signal.h>
 #ifdef mach /* KLUDGE: #ifdef on lowercase symbols? Ick. -- WHN 19990904 */
@@ -139,8 +140,8 @@ fake_foreign_function_call(os_context_t *context)
        == 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))
-           == type_FunctionPointer) {
+        if (lowtagof(*os_context_register_addr(context, reg_CODE))
+           == FUN_POINTER_LOWTAG) {
             /* We have called, but not built the new frame, so
              * build it for them. */
             current_control_frame_pointer[0] =
@@ -213,6 +214,7 @@ undo_fake_foreign_function_call(os_context_t *context)
      * FREE_INTERRUPT_CONTEXT_INDEX? If so, we should say so. And
      * perhaps yes, unbind_to_here() really would be clearer and less
      * fragile.. */
+    /* dan (2001.08.10) thinks the above supposition is probably correct */
     unbind();
 
 #ifdef reg_ALLOC
@@ -389,7 +391,7 @@ interrupt_handle_now(int signal, siginfo_t *info, void *void_context)
         * support decides to pass on it. */
        lose("no handler for signal %d in interrupt_handle_now(..)", signal);
 
-    } else if (LowtagOf(handler.lisp) == type_FunctionPointer) {
+    } else if (lowtagof(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
@@ -624,18 +626,19 @@ undoably_install_low_level_interrupt_handler (int signal,
     sigaddset_blockable(&sa.sa_mask);
     sa.sa_flags = SA_SIGINFO | SA_RESTART;
 
-    /* In the case of interrupt handlers which are modified
-     * more than once, we only save the original unmodified
-     * copy. */
+    /* In the case of interrupt handlers which are modified more than
+     * once, we only save the original unmodified copy. */
     if (!old_low_level_signal_handler_state->was_modified) {
+       struct sigaction *old_handler =
+           (struct sigaction*) &old_low_level_signal_handler_state->handler;
        old_low_level_signal_handler_state->was_modified = 1;
-       sigaction(signal, &sa, &old_low_level_signal_handler_state->handler);
+       sigaction(signal, &sa, old_handler);
     } else {
        sigaction(signal, &sa, NULL);
     }
 
     interrupt_low_level_handlers[signal] =
-       (ARE_SAME_HANDLER(handler,SIG_DFL) ? 0 : handler);
+       (ARE_SAME_HANDLER(handler, SIG_DFL) ? 0 : handler);
 }
 
 /* This is called from Lisp. */