summaryrefslogtreecommitdiffstats
path: root/signal.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-06 18:35:48 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-06 18:35:48 -0700
commitc2e0ec801502ae26dae3dfdd035ff10436cffedd (patch)
treec27e5fd60688f16939d98d331fa4bbe0d2a0303a /signal.h
parent59aa1488ac6deec474dc5287d4866223e1bcd005 (diff)
downloadtxr-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.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/signal.h b/signal.h
index 4b942275..2b6245e0 100644
--- a/signal.h
+++ b/signal.h
@@ -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