X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fruntime%2Finterrupt.c;h=94b38b81658b6dc147bc7e9868ec74e706db37ab;hb=3b90774a1ea68bf42579594c872de16fb33f1454;hp=e01097137b2279f1daddfd0233ad39688dd2ff2a;hpb=c3554861f21143572552a2ce8095fa9a13effa4f;p=sbcl.git diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index e010971..94b38b8 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -125,7 +125,7 @@ static sigset_t blockable_sigset; void check_blockables_blocked_or_lose() { -#ifndef LISP_FEATURE_WIN32 +#if !defined(LISP_FEATURE_WIN32) /* Get the current sigmask, by blocking the empty set. */ sigset_t empty,current; int i; @@ -186,6 +186,14 @@ block_blockable_signals(void) #endif } +void +block_deferrable_signals(void) +{ +#ifndef LISP_FEATURE_WIN32 + thread_sigmask(SIG_BLOCK, &deferrable_sigset, 0); +#endif +} + /* * utility routines used by various signal handlers @@ -576,7 +584,6 @@ run_deferred_handler(struct interrupt_data *data, void *v_context) { * pending handler before calling it. Trust the handler to finish * with the siginfo before enabling interrupts. */ void (*pending_handler) (int, siginfo_t*, void*)=data->pending_handler; - os_context_t *context = arch_os_get_context(&v_context); data->pending_handler=0; (*pending_handler)(data->pending_signal,&(data->pending_info), v_context); @@ -814,7 +821,7 @@ gc_trigger_hit(int signal, siginfo_t *info, os_context_t *context) else{ void *badaddr=arch_get_bad_addr(signal,info,context); return (badaddr >= (void *)current_auto_gc_trigger && - badaddr <((void *)current_dynamic_space + DYNAMIC_SPACE_SIZE)); + badaddr <((void *)current_dynamic_space + dynamic_space_size)); } } #endif @@ -1376,3 +1383,24 @@ interrupt_init() SHOW("returning from interrupt_init()"); #endif } + +#ifndef LISP_FEATURE_WIN32 +int +siginfo_code(siginfo_t *info) +{ + return info->si_code; +} +os_vm_address_t current_memory_fault_address; + +void +lisp_memory_fault_error(os_context_t *context, os_vm_address_t addr) +{ + /* FIXME: This is lossy: if we get another memory fault (eg. from + * another thread) before lisp has read this, we the information. + * However, since this is mostly informative, we'll live with that for + * now -- some address is better then no address in this case. + */ + current_memory_fault_address = addr; + arrange_return_to_lisp_function(context, SymbolFunction(MEMORY_FAULT_ERROR)); +} +#endif