From b6647cd1f3fada446b089002bfc5994c7d0bd789 Mon Sep 17 00:00:00 2001 From: Sven Wischnowsky Date: Mon, 18 Jun 2001 07:38:35 +0000 Subject: 14951 --- Src/signals.c | 4 ++-- Src/signals.h | 35 +++++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 16 deletions(-) (limited to 'Src') diff --git a/Src/signals.c b/Src/signals.c index 649d78b73..e67887170 100644 --- a/Src/signals.c +++ b/Src/signals.c @@ -93,7 +93,7 @@ install_handler(int sig) #ifdef POSIX_SIGNALS struct sigaction act; - act.sa_handler = (SIGNAL_HANDTYPE) handler; + act.sa_handler = (SIGNAL_HANDTYPE) zhandler; sigemptyset(&act.sa_mask); /* only block sig while in handler */ act.sa_flags = 0; # ifdef SA_INTERRUPT /* SunOS 4.x */ @@ -401,7 +401,7 @@ signal_suspend(int sig, int sig2) /**/ mod_export RETSIGTYPE -handler(int sig) +zhandler(int sig) { sigset_t newmask, oldmask; diff --git a/Src/signals.h b/Src/signals.h index b1970e0f2..4b8197d84 100644 --- a/Src/signals.h +++ b/Src/signals.h @@ -73,26 +73,34 @@ * queue signals, it is probably overkill for zsh to do * * this, but it shouldn't hurt anything to do it anyway. */ -/* Right now I'm queueing all signals, but maybe we only * - * need to queue SIGCHLD. Anybody know? */ - -#define MAX_QUEUE_SIZE 16 +#define MAX_QUEUE_SIZE 128 #define queue_signals() (queueing_enabled++) +#define run_queued_signals() do { \ + while (queue_front != queue_rear) { /* while signals in queue */ \ + sigset_t oset; \ + queue_front = (queue_front + 1) % MAX_QUEUE_SIZE; \ + oset = signal_setmask(signal_mask_queue[queue_front]); \ + zhandler(signal_queue[queue_front]); /* handle queued signal */ \ + signal_setmask(oset); \ + } \ +} while (0) + #define unqueue_signals() do { \ DPUTS(!queueing_enabled, "BUG: unqueue_signals called but not queueing"); \ - if (!--queueing_enabled) { \ - while (queue_front != queue_rear) { /* while signals in queue */ \ - sigset_t oset; \ - queue_front = (queue_front + 1) % MAX_QUEUE_SIZE; \ - oset = signal_setmask(signal_mask_queue[queue_front]); \ - handler(signal_queue[queue_front]); /* handle queued signal */ \ - signal_setmask(oset); \ - } \ - } \ + if (!--queueing_enabled) run_queued_signals(); \ } while (0) +#define queue_signal_level() queueing_enabled + +#define dont_queue_signals() do { \ + queueing_enabled = 0; \ + run_queued_signals(); \ +} while (0) + +#define restore_queue_signals(q) (queueing_enabled = (q)) + /* Make some signal functions faster. */ @@ -117,4 +125,3 @@ extern sigset_t signal_block _((sigset_t)); #else extern sigset_t signal_unblock _((sigset_t)); #endif /* POSIX_SIGNALS */ - -- cgit 1.4.1