X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-arch.c;h=543c7e0f7bf9692a59d4cc77257bc6becb3dcb0d;hb=1b6dc22623c7bdc5137e98541f0e21f8f1c55caa;hp=d2213d58324900dad06e759127bff621326eb5cc;hpb=3bb2fb5b9ecdeebecaded4ac6e5af0f653be8867;p=sbcl.git diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index d2213d5..543c7e0 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -24,6 +24,7 @@ #include "interr.h" #include "breakpoint.h" #include "monitor.h" +#include "thread.h" #include "genesis/static-symbols.h" #include "genesis/symbol.h" @@ -71,8 +72,7 @@ void arch_skip_instruction(os_context_t *context) int vlen; int code; - FSHOW((stderr, "/[arch_skip_inst at %x]\n", *os_context_pc_addr(context))); - + /* Get and skip the Lisp interrupt code. */ code = *(char*)(*os_context_pc_addr(context))++; switch (code) @@ -115,13 +115,14 @@ arch_internal_error_arguments(os_context_t *context) boolean arch_pseudo_atomic_atomic(os_context_t *context) { - return SymbolValue(PSEUDO_ATOMIC_ATOMIC); + return SymbolValue(PSEUDO_ATOMIC_ATOMIC,arch_os_get_current_thread()); } void arch_set_pseudo_atomic_interrupted(os_context_t *context) { - SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1)); + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1), + arch_os_get_current_thread()); } /* @@ -190,6 +191,7 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) int code = info->si_code; os_context_t *context = (os_context_t*)void_context; unsigned int trap; + sigset_t ss; if (single_stepping && (signal==SIGTRAP)) { @@ -240,6 +242,9 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) case trap_PendingInterrupt: FSHOW((stderr, "/\n")); arch_skip_instruction(context); + sigemptyset(&ss); + sigaddset(&ss,SIGTRAP); + sigprocmask(SIG_UNBLOCK,&ss,0); interrupt_handle_pending(context); break; @@ -316,6 +321,7 @@ call_into_lisp(lispobj fun, lispobj *args, int nargs); * could be in registers depending on what the compiler likes. So we * copy the args into a portable vector and let the assembly language * call-in function figure it out. */ + lispobj funcall0(lispobj function) {