diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-09-06 18:35:48 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-09-06 18:35:48 -0700 |
commit | c2e0ec801502ae26dae3dfdd035ff10436cffedd (patch) | |
tree | c27e5fd60688f16939d98d331fa4bbe0d2a0303a /signal.h | |
parent | 59aa1488ac6deec474dc5287d4866223e1bcd005 (diff) | |
download | txr-c2e0ec801502ae26dae3dfdd035ff10436cffedd.tar.gz txr-c2e0ec801502ae26dae3dfdd035ff10436cffedd.tar.bz2 txr-c2e0ec801502ae26dae3dfdd035ff10436cffedd.zip |
Allow evaluation from repl to be interrupted.
* eval.c (do_eval): Check for pending signals.
* parser.c (repl_intr): New static function.
(repl): Set up signal handler for SIGINT around REPL.
* signal.h (sig_deferred): declared.
(sig_check_fast): New inline function/macro.
A bit of a rearrangement here.
Diffstat (limited to 'signal.h')
-rw-r--r-- | signal.h | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -70,6 +70,14 @@ extern int debug_depth; sig_check(); \ } while(0) +val sig_check(void); + +INLINE val sig_check_fast(void) +{ + extern volatile unsigned long sig_deferred; + return if2(sig_deferred, sig_check()); +} + typedef struct { jmp_buf jb; sig_atomic_t se; @@ -112,6 +120,8 @@ extern volatile sig_atomic_t async_sig_enabled; #define sig_restore_enable } while (0) #define sig_restore_disable } while (0) +#define sig_check_fast() ((void) 0) + typedef struct { jmp_buf jb; val de; @@ -146,7 +156,6 @@ extern val dyn_env; /* eval.c */ void sig_init(void); val set_sig_handler(val signo, val lambda); val get_sig_handler(val signo); -val sig_check(void); #if HAVE_POSIX_SIGS int sig_mask(int how, const sigset_t *set, sigset_t *oldset); #endif |