summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2013-12-12 23:12:21 -0800
committerKaz Kylheku <kaz@kylheku.com>2013-12-12 23:12:21 -0800
commitf3b0217d7a5d9d050f0781defa5339ef29a00c1c (patch)
tree12748e3e9e7b065d7c1b4a20d0371978e8c02991
parentb3f8bee89e3fa5713ff391e0172b8e1d4b92be25 (diff)
downloadtxr-f3b0217d7a5d9d050f0781defa5339ef29a00c1c.tar.gz
txr-f3b0217d7a5d9d050f0781defa5339ef29a00c1c.tar.bz2
txr-f3b0217d7a5d9d050f0781defa5339ef29a00c1c.zip
* eval.c (eval_init): Registered vars for signal numbers.
* signal.c (sig_hup, sig_int, sig_quit, sig_ill, sig_trap, sig_abrt, sig_bus, val sig_fpe, sig_kill, sig_usr1, sig_segv, sig_usr2, sig_pipe, sig_alrm, val sig_term, sig_chld, sig_cont, sig_stop, sig_tstp, sig_ttin, val sig_ttou, sig_urg, sig_xcpu, sig_xfsz, sigtalrm, sig_prof, val sig_poll, sig_sys, sig_winch, sig_iot, sig_stkflt, sig_io, sig_lost, sig_pwr): New variables. (sig_init): New variables initialized. * signal.h: New variables declared.
-rw-r--r--ChangeLog14
-rw-r--r--eval.c46
-rw-r--r--signal.c54
-rw-r--r--signal.h7
4 files changed, 121 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 38e4a8c7..ee8439d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
2013-12-12 Kaz Kylheku <kaz@kylheku.com>
+ * eval.c (eval_init): Registered vars for signal numbers.
+
+ * signal.c (sig_hup, sig_int, sig_quit, sig_ill, sig_trap, sig_abrt,
+ sig_bus, val sig_fpe, sig_kill, sig_usr1, sig_segv, sig_usr2, sig_pipe,
+ sig_alrm, val sig_term, sig_chld, sig_cont, sig_stop, sig_tstp,
+ sig_ttin, val sig_ttou, sig_urg, sig_xcpu, sig_xfsz, sigtalrm,
+ sig_prof, val sig_poll, sig_sys, sig_winch, sig_iot, sig_stkflt,
+ sig_io, sig_lost, sig_pwr): New variables.
+ (sig_init): New variables initialized.
+
+ * signal.h: New variables declared.
+
+2013-12-12 Kaz Kylheku <kaz@kylheku.com>
+
First cut at signal handling support.
* Makefile (OBJS-y): Include signal.o if have_posix_sigs is "y".
diff --git a/eval.c b/eval.c
index f30e895f..b6b87657 100644
--- a/eval.c
+++ b/eval.c
@@ -2648,6 +2648,52 @@ void eval_init(void)
reg_fun(intern(lit("set-sig-handler"), user_package), func_n2(set_sig_handler));
reg_fun(intern(lit("get-sig-handler"), user_package), func_n1(get_sig_handler));
reg_fun(intern(lit("sig-check"), user_package), func_n0(sig_check));
+ reg_var(intern(lit("sig-hup"), user_package), &sig_hup);
+ reg_var(intern(lit("sig-int"), user_package), &sig_int);
+ reg_var(intern(lit("sig-quit"), user_package), &sig_quit);
+ reg_var(intern(lit("sig-ill"), user_package), &sig_ill);
+ reg_var(intern(lit("sig-trap"), user_package), &sig_trap);
+ reg_var(intern(lit("sig-abrt"), user_package), &sig_abrt);
+ reg_var(intern(lit("sig-bus"), user_package), &sig_bus);
+ reg_var(intern(lit("sig-fpe"), user_package), &sig_fpe);
+ reg_var(intern(lit("sig-kill"), user_package), &sig_kill);
+ reg_var(intern(lit("sig-usr1"), user_package), &sig_usr1);
+ reg_var(intern(lit("sig-segv"), user_package), &sig_segv);
+ reg_var(intern(lit("sig-usr2"), user_package), &sig_usr2);
+ reg_var(intern(lit("sig-pipe"), user_package), &sig_pipe);
+ reg_var(intern(lit("sig-alrm"), user_package), &sig_alrm);
+ reg_var(intern(lit("sig-term"), user_package), &sig_term);
+ reg_var(intern(lit("sig-chld"), user_package), &sig_chld);
+ reg_var(intern(lit("sig-cont"), user_package), &sig_cont);
+ reg_var(intern(lit("sig-stop"), user_package), &sig_stop);
+ reg_var(intern(lit("sig-tstp"), user_package), &sig_tstp);
+ reg_var(intern(lit("sig-ttin"), user_package), &sig_ttin);
+ reg_var(intern(lit("sig-ttou"), user_package), &sig_ttou);
+ reg_var(intern(lit("sig-urg"), user_package), &sig_urg);
+ reg_var(intern(lit("sig-xcpu"), user_package), &sig_xcpu);
+ reg_var(intern(lit("sig-xfsz"), user_package), &sig_xfsz);
+ reg_var(intern(lit("sig-vtalrm"), user_package), &sigtalrm);
+ reg_var(intern(lit("sig-prof"), user_package), &sig_prof);
+ reg_var(intern(lit("sig-poll"), user_package), &sig_poll);
+ reg_var(intern(lit("sig-sys"), user_package), &sig_sys);
+#ifdef SIGWINCH
+ reg_var(intern(lit("sig-winch"), user_package), &sig_winch);
+#endif
+#ifdef SIGIOT
+ reg_var(intern(lit("sig-iot"), user_package), &sig_iot);
+#endif
+#ifdef SIGSTKFLT
+ reg_var(intern(lit("sig-stkflt"), user_package), &sig_stkflt);
+#endif
+#ifdef SIGIO
+ reg_var(intern(lit("sig-io"), user_package), &sig_io);
+#endif
+#ifdef SIGLOST
+ reg_var(intern(lit("sig-lost"), user_package), &sig_lost);
+#endif
+#ifdef SIGPWR
+ reg_var(intern(lit("sig-pwr"), user_package), &sig_pwr);
+#endif
#endif
reg_fun(intern(lit("source-loc"), user_package), func_n1(source_loc));
diff --git a/signal.c b/signal.c
index 05ad9eb6..f680bf4d 100644
--- a/signal.c
+++ b/signal.c
@@ -46,6 +46,13 @@ volatile sig_atomic_t async_sig_enabled = 0;
static val sig_lambda[MAX_SIG];
volatile unsigned long sig_deferred;
+val sig_hup, sig_int, sig_quit, sig_ill, sig_trap, sig_abrt, sig_bus;
+val sig_fpe, sig_kill, sig_usr1, sig_segv, sig_usr2, sig_pipe, sig_alrm;
+val sig_term, sig_chld, sig_cont, sig_stop, sig_tstp, sig_ttin;
+val sig_ttou, sig_urg, sig_xcpu, sig_xfsz, sigtalrm, sig_prof;
+val sig_poll, sig_sys, sig_winch, sig_iot, sig_stkflt;
+val sig_io, sig_lost, sig_pwr;
+
static void sig_handler(int sig)
{
val lambda = sig_lambda[sig];
@@ -70,6 +77,53 @@ void sig_init(void)
sig_lambda[i] = t;
prot1(&sig_lambda[i]);
}
+
+ sig_hup = num_fast(SIGHUP);
+ sig_int = num_fast(SIGINT);
+ sig_quit = num_fast(SIGQUIT);
+ sig_ill = num_fast(SIGILL);
+ sig_trap = num_fast(SIGTRAP);
+ sig_abrt = num_fast(SIGABRT);
+ sig_bus = num_fast(SIGBUS);
+ sig_fpe = num_fast(SIGFPE);
+ sig_kill = num_fast(SIGKILL);
+ sig_usr1 = num_fast(SIGUSR1);
+ sig_segv = num_fast(SIGSEGV);
+ sig_usr2 = num_fast(SIGUSR2);
+ sig_pipe = num_fast(SIGPIPE);
+ sig_alrm = num_fast(SIGALRM);
+ sig_term = num_fast(SIGTERM);
+ sig_chld = num_fast(SIGCHLD);
+ sig_cont = num_fast(SIGCONT);
+ sig_stop = num_fast(SIGSTOP);
+ sig_tstp = num_fast(SIGTSTP);
+ sig_ttin = num_fast(SIGTTIN);
+ sig_ttou = num_fast(SIGTTOU);
+ sig_urg = num_fast(SIGURG);
+ sig_xcpu = num_fast(SIGXCPU);
+ sig_xfsz = num_fast(SIGXFSZ);
+ sigtalrm = num_fast(SIGVTALRM);
+ sig_prof = num_fast(SIGPROF);
+ sig_poll = num_fast(SIGPOLL);
+ sig_sys = num_fast(SIGSYS);
+#ifdef SIGWINCH
+ sig_winch = num_fast(SIGWINCH);
+#endif
+#ifdef SIGIOT
+ sig_iot = num_fast(SIGIOT);
+#endif
+#ifdef SIGSTKFLT
+ sig_stkflt = num_fast(SIGSTKFLT);
+#endif
+#ifdef SIGIO
+ sig_io = num_fast(SIGIO);
+#endif
+#ifdef SIGLOST
+ sig_lost = num_fast(SIGLOST);
+#endif
+#ifdef SIGPWR
+ sig_pwr = num_fast(SIGPWR);
+#endif
}
val set_sig_handler(val signo, val lambda)
diff --git a/signal.h b/signal.h
index 111c6265..e2b794c1 100644
--- a/signal.h
+++ b/signal.h
@@ -87,6 +87,13 @@ tyedef jmp_buf extended_jmp_buf;
extern volatile sig_atomic_t async_sig_enabled;
+extern val sig_hup, sig_int, sig_quit, sig_ill, sig_trap, sig_abrt, sig_bus;
+extern val sig_fpe, sig_kill, sig_usr1, sig_segv, sig_usr2, sig_pipe, sig_alrm;
+extern val sig_term, sig_chld, sig_cont, sig_stop, sig_tstp, sig_ttin;
+extern val sig_ttou, sig_urg, sig_xcpu, sig_xfsz, sigtalrm, sig_prof;
+extern val sig_poll, sig_sys, sig_winch, sig_iot, sig_stkflt;
+extern val sig_io, sig_lost, sig_pwr;
+
void sig_init(void);
val set_sig_handler(val signo, val lambda);
val get_sig_handler(val signo);