Mercurial > hg > xemacs-beta
comparison 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 |
comparison
equal
deleted
inserted
replaced
612:ff0d9e7facba | 613:023b83f4e54b |
---|---|
247 signal_error (Qinternal_error, "internal error", Qunbound); | 247 signal_error (Qinternal_error, "internal error", Qunbound); |
248 | 248 |
249 return Qnil; | 249 return Qnil; |
250 } | 250 } |
251 | 251 |
252 #if defined (WIN32_NATIVE) || defined (CYGWIN_BROKEN_SIGNALS) | |
253 | |
254 /* setitimer() does not exist on native MS Windows, and appears broken | |
255 on Cygwin (random lockups when BROKEN_SIGIO is defined), so we | |
256 emulate in both cases by using multimedia timers. Furthermore, | |
257 the lockups still occur on Cygwin even when we do nothing but | |
258 use the standard signalling mechanism -- so we have to emulate | |
259 that, too. (But only for timeouts -- we have to use the standard | |
260 mechanism for SIGCHLD. Yuck.) | |
261 */ | |
262 | |
263 | |
264 /*--------------------------------------------------------------------*/ | |
265 /* Signal support */ | |
266 /*--------------------------------------------------------------------*/ | |
267 | |
268 #define sigmask(nsig) (1U << nsig) | |
269 | |
270 /* We can support as many signals as fit into word */ | |
271 #define SIG_MAX 32 | |
272 | |
273 /* Signal handlers. Initial value = 0 = SIG_DFL */ | |
274 static mswindows_sighandler signal_handlers[SIG_MAX] = {0}; | |
275 | |
276 /* Signal block mask: bit set to 1 means blocked */ | |
277 unsigned signal_block_mask = 0; | |
278 | |
279 /* Signal pending mask: bit set to 1 means sig is pending */ | |
280 unsigned signal_pending_mask = 0; | |
281 | |
282 mswindows_sighandler | |
283 mswindows_sigset (int nsig, mswindows_sighandler handler) | |
284 { | |
285 /* We delegate some signals to the system function */ | |
286 if (nsig == SIGFPE || nsig == SIGABRT || nsig == SIGINT) | |
287 return signal (nsig, handler); | |
288 | |
289 if (nsig < 0 || nsig > SIG_MAX) | |
290 { | |
291 errno = EINVAL; | |
292 return NULL; | |
293 } | |
294 | |
295 /* Store handler ptr */ | |
296 { | |
297 mswindows_sighandler old_handler = signal_handlers[nsig]; | |
298 signal_handlers[nsig] = handler; | |
299 return old_handler; | |
300 } | |
301 } | |
302 | |
303 int | |
304 mswindows_sighold (int nsig) | |
305 { | |
306 if (nsig < 0 || nsig > SIG_MAX) | |
307 return errno = EINVAL; | |
308 | |
309 signal_block_mask |= sigmask (nsig); | |
310 return 0; | |
311 } | |
312 | |
313 int | |
314 mswindows_sigrelse (int nsig) | |
315 { | |
316 if (nsig < 0 || nsig > SIG_MAX) | |
317 return errno = EINVAL; | |
318 | |
319 signal_block_mask &= ~sigmask (nsig); | |
320 | |
321 if (signal_pending_mask & sigmask (nsig)) | |
322 mswindows_raise (nsig); | |
323 | |
324 return 0; | |
325 } | |
326 | |
327 int | |
328 mswindows_sigpause (int nsig) | |
329 { | |
330 /* This is currently not called, because the only call to sigpause | |
331 inside XEmacs is with SIGCHLD parameter. Just in case, we put an | |
332 assert here, so anyone adds a call to sigpause will be surprised | |
333 (or surprise someone else...) */ | |
334 assert (0); | |
335 return 0; | |
336 } | |
337 | |
338 int | |
339 mswindows_raise (int nsig) | |
340 { | |
341 /* We delegate some raises to the system routine */ | |
342 if (nsig == SIGFPE || nsig == SIGABRT || nsig == SIGINT) | |
343 return raise (nsig); | |
344 | |
345 if (nsig < 0 || nsig > SIG_MAX) | |
346 return errno = EINVAL; | |
347 | |
348 /* If the signal is blocked, remember to issue later */ | |
349 if (signal_block_mask & sigmask (nsig)) | |
350 { | |
351 signal_pending_mask |= sigmask (nsig); | |
352 return 0; | |
353 } | |
354 | |
355 if (signal_handlers[nsig] == SIG_IGN) | |
356 return 0; | |
357 | |
358 if (signal_handlers[nsig] != SIG_DFL) | |
359 { | |
360 (*signal_handlers[nsig]) (nsig); | |
361 return 0; | |
362 } | |
363 | |
364 /* Default signal actions */ | |
365 if (nsig == SIGALRM || nsig == SIGPROF) | |
366 exit (3); | |
367 | |
368 /* Other signals are ignored by default */ | |
369 return 0; | |
370 } | |
371 | |
252 | 372 |
253 /*--------------------------------------------------------------------*/ | 373 /*--------------------------------------------------------------------*/ |
254 /* Async timers */ | 374 /* Async timers */ |
255 /*--------------------------------------------------------------------*/ | 375 /*--------------------------------------------------------------------*/ |
256 | 376 |
257 /* setitimer() does not exist on native MS Windows, and appears broken | |
258 on Cygwin (random lockups when BROKEN_SIGIO is defined), so we | |
259 emulate in both cases by using multimedia timers. */ | |
260 | |
261 /* We emulate two timers, one for SIGALRM, another for SIGPROF. | 377 /* We emulate two timers, one for SIGALRM, another for SIGPROF. |
262 | 378 |
263 itimerproc() function has an implementation limitation: it does | 379 itimerproc() function has an implementation limitation: it does |
264 not allow to set *both* interval and period. If an attempt is | 380 not allow to set *both* interval and period. If an attempt is |
265 made to set both, and then they are unequal, the function | 381 made to set both, and then they are unequal, the function |
286 static void CALLBACK | 402 static void CALLBACK |
287 setitimer_helper_proc (UINT uID, UINT uMsg, DWORD dwUser, | 403 setitimer_helper_proc (UINT uID, UINT uMsg, DWORD dwUser, |
288 DWORD dw1, DWORD dw2) | 404 DWORD dw1, DWORD dw2) |
289 { | 405 { |
290 /* Just raise the signal indicated by the dwUser parameter */ | 406 /* Just raise the signal indicated by the dwUser parameter */ |
291 #ifdef CYGWIN | |
292 kill (getpid (), dwUser); | |
293 #else | |
294 mswindows_raise (dwUser); | 407 mswindows_raise (dwUser); |
295 #endif | |
296 } | 408 } |
297 | 409 |
298 /* Divide time in ms specified by IT by DENOM. Return 1 ms | 410 /* Divide time in ms specified by IT by DENOM. Return 1 ms |
299 if division results in zero */ | 411 if division results in zero */ |
300 static UINT | 412 static UINT |
381 return setitimer_helper (itnew, itold, &it_prof, &tid_prof, SIGPROF); | 493 return setitimer_helper (itnew, itold, &it_prof, &tid_prof, SIGPROF); |
382 else | 494 else |
383 return errno = EINVAL; | 495 return errno = EINVAL; |
384 } | 496 } |
385 | 497 |
498 #endif /* defined (WIN32_NATIVE) || defined (CYGWIN_BROKEN_SIGNALS) */ | |
499 | |
386 | 500 |
387 void | 501 void |
388 syms_of_win32 (void) | 502 syms_of_win32 (void) |
389 { | 503 { |
390 DEFSUBR (Fmswindows_shell_execute); | 504 DEFSUBR (Fmswindows_shell_execute); |