aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii1997-01-16 12:50:00 +0000
committerEli Zaretskii1997-01-16 12:50:00 +0000
commit417a04bb0406f9fb5f2bba9f294bf380de64fa41 (patch)
treed59a55b9efe697b6a7f731bc1cea5b244fe27c2e /src
parentbf8360aed29c9011653cfb65c61addcc3fa092ac (diff)
downloademacs-417a04bb0406f9fb5f2bba9f294bf380de64fa41.tar.gz
emacs-417a04bb0406f9fb5f2bba9f294bf380de64fa41.zip
* (sigprocmask, sig_suspender): New functions, implement
signal blocking on MSDOS.
Diffstat (limited to 'src')
-rw-r--r--src/msdos.c112
1 files changed, 111 insertions, 1 deletions
diff --git a/src/msdos.c b/src/msdos.c
index c961be34656..864a18d4b83 100644
--- a/src/msdos.c
+++ b/src/msdos.c
@@ -69,6 +69,7 @@ Boston, MA 02111-1307, USA. */
69#if __DJGPP__ > 1 69#if __DJGPP__ > 1
70 70
71#include <signal.h> 71#include <signal.h>
72#include "syssignal.h"
72 73
73#ifndef SYSTEM_MALLOC 74#ifndef SYSTEM_MALLOC
74 75
@@ -3144,14 +3145,123 @@ int kill (x, y) int x, y; { return -1; }
3144nice (p) int p; {} 3145nice (p) int p; {}
3145void volatile pause () {} 3146void volatile pause () {}
3146sigsetmask (x) int x; { return 0; } 3147sigsetmask (x) int x; { return 0; }
3148sigblock (mask) int mask; { return 0; }
3147#endif 3149#endif
3148 3150
3149request_sigio () {} 3151request_sigio () {}
3150setpgrp () {return 0; } 3152setpgrp () {return 0; }
3151setpriority (x,y,z) int x,y,z; { return 0; } 3153setpriority (x,y,z) int x,y,z; { return 0; }
3152sigblock (mask) int mask; { return 0; }
3153unrequest_sigio () {} 3154unrequest_sigio () {}
3154 3155
3156#if __DJGPP__ > 1
3157
3158#ifdef POSIX_SIGNALS
3159
3160/* Augment DJGPP library POSIX signal functions. This is needed
3161 as of DJGPP v2.01, but might be in the library in later releases. */
3162
3163#include <libc/bss.h>
3164
3165/* A counter to know when to re-initialize the static sets. */
3166static int sigprocmask_count = -1;
3167
3168/* Which signals are currently blocked (initially none). */
3169static sigset_t current_mask;
3170
3171/* Which signals are pending (initially none). */
3172static sigset_t pending_signals;
3173
3174/* Previous handlers to restore when the blocked signals are unblocked. */
3175typedef void (*sighandler_t)(int);
3176static sighandler_t prev_handlers[320];
3177
3178/* A signal handler which just records that a signal occured
3179 (it will be raised later, if and when the signal is unblocked). */
3180static void
3181sig_suspender (signo)
3182 int signo;
3183{
3184 sigaddset (&pending_signals, signo);
3185}
3186
3187int
3188sigprocmask (how, new_set, old_set)
3189 int how;
3190 const sigset_t *new_set;
3191 sigset_t *old_set;
3192{
3193 int signo;
3194 sigset_t new_mask;
3195
3196 /* If called for the first time, initialize. */
3197 if (sigprocmask_count != __bss_count)
3198 {
3199 sigprocmask_count = __bss_count;
3200 sigemptyset (&pending_signals);
3201 sigemptyset (&current_mask);
3202 for (signo = 0; signo < 320; signo++)
3203 prev_handlers[signo] = SIG_ERR;
3204 }
3205
3206 if (old_set)
3207 *old_set = current_mask;
3208
3209 if (new_set == 0)
3210 return 0;
3211
3212 if (how != SIG_BLOCK && how != SIG_UNBLOCK && how != SIG_SETMASK)
3213 {
3214 errno = EINVAL;
3215 return -1;
3216 }
3217
3218 sigemptyset (&new_mask);
3219
3220 /* DJGPP supports upto 320 signals. */
3221 for (signo = 0; signo < 320; signo++)
3222 {
3223 if (sigismember (&current_mask, signo))
3224 sigaddset (&new_mask, signo);
3225 else if (sigismember (new_set, signo) && how != SIG_UNBLOCK)
3226 {
3227 sigaddset (&new_mask, signo);
3228
3229 /* SIGKILL is silently ignored, as on other platforms. */
3230 if (signo != SIGKILL && prev_handlers[signo] == SIG_ERR)
3231 prev_handlers[signo] = signal (signo, sig_suspender);
3232 }
3233 if (( how == SIG_UNBLOCK
3234 && sigismember (&new_mask, signo)
3235 && sigismember (new_set, signo))
3236 || (how == SIG_SETMASK
3237 && sigismember (&new_mask, signo)
3238 && !sigismember (new_set, signo)))
3239 {
3240 sigdelset (&new_mask, signo);
3241 if (prev_handlers[signo] != SIG_ERR)
3242 {
3243 signal (signo, prev_handlers[signo]);
3244 prev_handlers[signo] = SIG_ERR;
3245 }
3246 if (sigismember (&pending_signals, signo))
3247 {
3248 sigdelset (&pending_signals, signo);
3249 raise (signo);
3250 }
3251 }
3252 }
3253 current_mask = new_mask;
3254 return 0;
3255}
3256
3257#else /* not POSIX_SIGNALS */
3258
3259sigsetmask (x) int x; { return 0; }
3260sigblock (mask) int mask; { return 0; }
3261
3262#endif /* not POSIX_SIGNALS */
3263#endif /* __DJGPP__ > 1 */
3264
3155#ifndef HAVE_SELECT 3265#ifndef HAVE_SELECT
3156#include "sysselect.h" 3266#include "sysselect.h"
3157 3267