Mercurial > hg > xemacs-beta
diff src/win32.c @ 613:023b83f4e54b
[xemacs-hg @ 2001-06-10 10:42:16 by ben]
------ signal-code changes ------
data.c, device-tty.c, emacs.c, floatfns.c, linuxplay.c, nas.c,
process-unix.c, signal.c, sunplay.c, sysdep.c, syssignal.h:
use EMACS_SIGNAL everywhere instead of playing preprocessing
games with signal().
s\windowsnt.h, s\mingw32.h, syssignal.h:
Remove mswindows signal code from s+m headers and move to
syssignal.h as one of the five ways of signal handling,
instead of playing preprocessing games.
fileio.c, sysdep.c:
Rename sys_do_signal to qxe_reliable_signal.
signal.c, process-unix.c, profile.c:
Create set_timeout_signal(); use instead of just EMACS_SIGNAL
to establish a signal handler on a timeout signal; this does
special things under Cygwin.
nt.c:
Eliminate term_ntproc(), which is blank; used as a SIGABRT
handler, which was wrong anyway.
nt.c, win32.c:
Move signal code from nt.c to win32.c, since Cygwin needs it
too when dealing with timeout signals.
s\cygwin32.h:
Define CYGWIN_BROKEN_SIGNALS.
------ other changes ------
s\mingw32.h:
Fix problems with NOT_C_CODE being in the wrong place and
excluding defines needed when building Makefile.in.in.
filelock.c, mule-canna.c, mule-ccl.c, mule-ccl.h, ralloc.c,
unexalpha.c, unexapollo.c, unexcw.c, unexelfsgi.c, unexnt.c,
unexsni.c, s\aix3-1.h, s\bsd4-1.h, s\bsd4-2.h, s\bsd4-3.h, s\cxux.h,
s\cygwin32.h, s\dgux.h, s\dgux5-4r2.h, s\dgux5-4r3.h, s\dgux5-4r4.h,
s\ewsux5r4.h, s\gnu.h, s\hpux.h, s\iris3-5.h, s\iris3-6.h,
s\irix3-3.h, s\linux.h, s\mingw32.h, s\newsos5.h, s\nextstep.h,
s\ptx.h, s\riscix1-1.h, s\riscix1-2.h, s\rtu.h, s\sco4.h, s\sco5.h,
s\template.h, s\ultrix.h, s\umax.h, s\umips.h, s\unipl5-0.h,
s\unipl5-2.h, s\usg5-0.h, s\usg5-2-2.h, s\usg5-2.h, s\usg5-3.h,
s\usg5-4.h, s\windowsnt.h, s\xenix.h:
Rename 'GNU Emacs' to XEmacs in the copyright and comments.
nas.c:
Stylistic cleanup. Avoid preprocessing games with names such
as play_sound_file.
------ signal-code changes ------
data.c, device-tty.c, emacs.c, floatfns.c, linuxplay.c, nas.c,
process-unix.c, signal.c, sunplay.c, sysdep.c, syssignal.h:
use EMACS_SIGNAL everywhere instead of playing preprocessing
games with signal().
s\windowsnt.h, s\mingw32.h, syssignal.h:
Remove mswindows signal code from s+m headers and move to
syssignal.h as one of the five ways of signal handling,
instead of playing preprocessing games.
fileio.c, sysdep.c:
Rename sys_do_signal to qxe_reliable_signal.
signal.c, process-unix.c, profile.c:
Create set_timeout_signal(); use instead of just EMACS_SIGNAL
to establish a signal handler on a timeout signal; this does
special things under Cygwin.
nt.c:
Eliminate term_ntproc(), which is blank; used as a SIGABRT
handler, which was wrong anyway.
nt.c, win32.c:
Move signal code from nt.c to win32.c, since Cygwin needs it
too when dealing with timeout signals.
s\cygwin32.h:
Define CYGWIN_BROKEN_SIGNALS.
------ other changes ------
s\mingw32.h:
Fix problems with NOT_C_CODE being in the wrong place and
excluding defines needed when building Makefile.in.in.
filelock.c, mule-canna.c, mule-ccl.c, mule-ccl.h, ralloc.c,
unexalpha.c, unexapollo.c, unexcw.c, unexelfsgi.c, unexnt.c,
unexsni.c, s\aix3-1.h, s\bsd4-1.h, s\bsd4-2.h, s\bsd4-3.h, s\cxux.h,
s\cygwin32.h, s\dgux.h, s\dgux5-4r2.h, s\dgux5-4r3.h, s\dgux5-4r4.h,
s\ewsux5r4.h, s\gnu.h, s\hpux.h, s\iris3-5.h, s\iris3-6.h,
s\irix3-3.h, s\linux.h, s\mingw32.h, s\newsos5.h, s\nextstep.h,
s\ptx.h, s\riscix1-1.h, s\riscix1-2.h, s\rtu.h, s\sco4.h, s\sco5.h,
s\template.h, s\ultrix.h, s\umax.h, s\umips.h, s\unipl5-0.h,
s\unipl5-2.h, s\usg5-0.h, s\usg5-2-2.h, s\usg5-2.h, s\usg5-3.h,
s\usg5-4.h, s\windowsnt.h, s\xenix.h:
Rename 'GNU Emacs' to XEmacs in the copyright and comments.
nas.c:
Stylistic cleanup. Avoid preprocessing games with names such
as play_sound_file.
xemacs-faq.texi:
Update sections on Windows and MacOS availability.
alist.el, apropos.el, autoload.el, bytecomp.el, cl-compat.el, cl-extra.el, cl-macs.el, cl-seq.el, cl.el, cmdloop.el, cus-edit.el, derived.el, gpm.el, itimer.el, lisp-mode.el, shadow.el, version.el, wid-browse.el:
Rename 'GNU Emacs' to XEmacs in the copyright. Fix other
references to GNU Emacs that should be XEmacs or just Emacs.
files.el:
Fix warning.
simple.el:
transpose-line-up/down will now move the region up or down by
a line if active.
cvtmail.c, fakemail.c, gnuserv.c, gnuserv.h, gnuslib.c, make-msgfile.c, make-path.c, pop.c, pop.h, profile.c, tcp.c:
Rename 'GNU Emacs' to XEmacs in the copyright.
Fix comments in similar ways.
digest-doc.c, sorted-doc.c:
Fix program and author name to reflect XEmacs.
author | ben |
---|---|
date | Sun, 10 Jun 2001 10:42:39 +0000 |
parents | 38db05db9cb5 |
children | fdefd0186b75 |
line wrap: on
line diff
--- a/src/win32.c Sat Jun 09 09:02:04 2001 +0000 +++ b/src/win32.c Sun Jun 10 10:42:39 2001 +0000 @@ -249,15 +249,131 @@ return Qnil; } +#if defined (WIN32_NATIVE) || defined (CYGWIN_BROKEN_SIGNALS) + +/* setitimer() does not exist on native MS Windows, and appears broken + on Cygwin (random lockups when BROKEN_SIGIO is defined), so we + emulate in both cases by using multimedia timers. Furthermore, + the lockups still occur on Cygwin even when we do nothing but + use the standard signalling mechanism -- so we have to emulate + that, too. (But only for timeouts -- we have to use the standard + mechanism for SIGCHLD. Yuck.) + */ + + +/*--------------------------------------------------------------------*/ +/* Signal support */ +/*--------------------------------------------------------------------*/ + +#define sigmask(nsig) (1U << nsig) + +/* We can support as many signals as fit into word */ +#define SIG_MAX 32 + +/* Signal handlers. Initial value = 0 = SIG_DFL */ +static mswindows_sighandler signal_handlers[SIG_MAX] = {0}; + +/* Signal block mask: bit set to 1 means blocked */ +unsigned signal_block_mask = 0; + +/* Signal pending mask: bit set to 1 means sig is pending */ +unsigned signal_pending_mask = 0; + +mswindows_sighandler +mswindows_sigset (int nsig, mswindows_sighandler handler) +{ + /* We delegate some signals to the system function */ + if (nsig == SIGFPE || nsig == SIGABRT || nsig == SIGINT) + return signal (nsig, handler); + + if (nsig < 0 || nsig > SIG_MAX) + { + errno = EINVAL; + return NULL; + } + + /* Store handler ptr */ + { + mswindows_sighandler old_handler = signal_handlers[nsig]; + signal_handlers[nsig] = handler; + return old_handler; + } +} + +int +mswindows_sighold (int nsig) +{ + if (nsig < 0 || nsig > SIG_MAX) + return errno = EINVAL; + + signal_block_mask |= sigmask (nsig); + return 0; +} + +int +mswindows_sigrelse (int nsig) +{ + if (nsig < 0 || nsig > SIG_MAX) + return errno = EINVAL; + + signal_block_mask &= ~sigmask (nsig); + + if (signal_pending_mask & sigmask (nsig)) + mswindows_raise (nsig); + + return 0; +} + +int +mswindows_sigpause (int nsig) +{ + /* This is currently not called, because the only call to sigpause + inside XEmacs is with SIGCHLD parameter. Just in case, we put an + assert here, so anyone adds a call to sigpause will be surprised + (or surprise someone else...) */ + assert (0); + return 0; +} + +int +mswindows_raise (int nsig) +{ + /* We delegate some raises to the system routine */ + if (nsig == SIGFPE || nsig == SIGABRT || nsig == SIGINT) + return raise (nsig); + + if (nsig < 0 || nsig > SIG_MAX) + return errno = EINVAL; + + /* If the signal is blocked, remember to issue later */ + if (signal_block_mask & sigmask (nsig)) + { + signal_pending_mask |= sigmask (nsig); + return 0; + } + + if (signal_handlers[nsig] == SIG_IGN) + return 0; + + if (signal_handlers[nsig] != SIG_DFL) + { + (*signal_handlers[nsig]) (nsig); + return 0; + } + + /* Default signal actions */ + if (nsig == SIGALRM || nsig == SIGPROF) + exit (3); + + /* Other signals are ignored by default */ + return 0; +} + /*--------------------------------------------------------------------*/ /* Async timers */ /*--------------------------------------------------------------------*/ -/* setitimer() does not exist on native MS Windows, and appears broken - on Cygwin (random lockups when BROKEN_SIGIO is defined), so we - emulate in both cases by using multimedia timers. */ - /* We emulate two timers, one for SIGALRM, another for SIGPROF. itimerproc() function has an implementation limitation: it does @@ -288,11 +404,7 @@ DWORD dw1, DWORD dw2) { /* Just raise the signal indicated by the dwUser parameter */ -#ifdef CYGWIN - kill (getpid (), dwUser); -#else mswindows_raise (dwUser); -#endif } /* Divide time in ms specified by IT by DENOM. Return 1 ms @@ -383,6 +495,8 @@ return errno = EINVAL; } +#endif /* defined (WIN32_NATIVE) || defined (CYGWIN_BROKEN_SIGNALS) */ + void syms_of_win32 (void)