diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-03-13 02:47:00 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-03-13 02:47:00 -0700 |
commit | d5a6ad5bdb5bdea748a03e9bcc675e0dea33e1d5 (patch) | |
tree | e12db71b10ca5103f708272a50e28cd8ee555a03 /configure | |
parent | 5251ac1ca49b5abc0d68f77291eb463f2040eb31 (diff) | |
download | txr-d5a6ad5bdb5bdea748a03e9bcc675e0dea33e1d5.tar.gz txr-d5a6ad5bdb5bdea748a03e9bcc675e0dea33e1d5.tar.bz2 txr-d5a6ad5bdb5bdea748a03e9bcc675e0dea33e1d5.zip |
On platforms with sigaltstack, TXR programs can now catch the
segmentation fault that occurs when running out of stack space,
and escape by throwing an exception.
Also, bugfix: save and restore the gc enable/disable state. Without
this, if we are ever running cod in a gc disabled state and it jumps
out, gc stays disabled.
* configure: added check for sigaltstack.
* gc.h (gc_enabled): Declaration added for existing variable.
* signal.c (is_cpu_exception): New static function.
(sig_handler): For cpu_exception type signals that pertain
to the execution of some instruction, turn on async_sig_enabled,
so that the signal is not deferred. Otherwise we will just
return without calling the user-defined handler, restart
the instruction and get into a loop. Also, disable gc around
the handler just in case. One issue is that we might be on
an alternate stack, which gc won't like.
(setup_alt_stack, teardown_alt_stack): New static functions.
(set_sig_handler): If we have sigaltstack, and are asked
to set up a SEGV handler, then set it up on the alternate
stack.
* signal.h (extended_jmp_buf): Adding new member, gc.
(extended_setjmp, extended_longjmp): use gc member
to save and restore the gc_enable state across
setjmp and longjmp.
Diffstat (limited to 'configure')
-rwxr-xr-x | configure | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -1611,6 +1611,28 @@ else printf "no\n" fi +printf "Checking for sigaltstack ... " + +cat > conftest.c <<! +#include <signal.h> +#include <stdlib.h> + +int main(void) +{ + stack_t ss; + ss.ss_sp = malloc(SIGSTKSZ); + ss.ss_size = SIGSTKSZ; + ss.ss_flags = 0; + return sigaltstack(&ss, 0); +} +! +if conftest ; then + printf "yes\n" + printf "#define HAVE_SIGALTSTACK 1\n" >> config.h +else + printf "no\n" +fi + printf "Checking for makedev ... " cat > conftest.c <<! |