From f3b0217d7a5d9d050f0781defa5339ef29a00c1c Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 12 Dec 2013 23:12:21 -0800 Subject: * 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. --- ChangeLog | 14 ++++++++++++++ eval.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ signal.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ signal.h | 7 +++++++ 4 files changed, 121 insertions(+) diff --git a/ChangeLog b/ChangeLog index 38e4a8c7..ee8439d9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2013-12-12 Kaz Kylheku + + * 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 First cut at signal handling support. 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); -- cgit v1.2.3