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);