summaryrefslogtreecommitdiffstats
path: root/configure
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-03-13 02:47:00 -0700
committerKaz Kylheku <kaz@kylheku.com>2014-03-13 02:47:00 -0700
commitd5a6ad5bdb5bdea748a03e9bcc675e0dea33e1d5 (patch)
treee12db71b10ca5103f708272a50e28cd8ee555a03 /configure
parent5251ac1ca49b5abc0d68f77291eb463f2040eb31 (diff)
downloadtxr-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-xconfigure22
1 files changed, 22 insertions, 0 deletions
diff --git a/configure b/configure
index c897c7e2..ff7f67fa 100755
--- a/configure
+++ b/configure
@@ -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 <<!