X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/33017fafd17d722e82a268e9b272f27df261e09d..af80458d7e9d2f81a8d13a0b4ad152743c34520c:/src/syssignal.h diff --git a/src/syssignal.h b/src/syssignal.h dissimilarity index 79% index a2522f2442..d7399c6cb8 100644 --- a/src/syssignal.h +++ b/src/syssignal.h @@ -1,157 +1,61 @@ -/* syssignal.h - System-dependent definitions for signals. - -Copyright (C) 1993, 1999, 2001-2012 Free Software Foundation, Inc. - -This file is part of GNU Emacs. - -GNU Emacs is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -GNU Emacs is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Emacs. If not, see . */ - -extern void init_signals (void); - -#ifdef HAVE_PTHREAD -#include -/* If defined, asynchronous signals delivered to a non-main thread are - forwarded to the main thread. */ -#define FORWARD_SIGNAL_TO_MAIN_THREAD -#endif - -/* Don't #include . That header should always be #included - before "config.h", because some configuration files (like s/hpux.h) - indicate that SIGIO doesn't work by #undef-ing SIGIO. If this file - #includes , then that will re-#define SIGIO and confuse - things. */ -/* XXX This is not correct anymore, there is a BROKEN_SIGIO macro. */ - -#define SIGMASKTYPE sigset_t - -#define SIGEMPTYMASK (empty_mask) -extern sigset_t empty_mask; - -/* POSIX pretty much destroys any possibility of writing sigmask as a - macro in standard C. We always define our own version because the - predefined macro in Glibc 2.1 is only provided for compatibility for old - programs that use int as signal mask type. */ -#undef sigmask -#ifdef __GNUC__ -#define sigmask(SIG) \ - ({ \ - sigset_t _mask; \ - sigemptyset (&_mask); \ - sigaddset (&_mask, SIG); \ - _mask; \ - }) -#else /* ! defined (__GNUC__) */ -extern sigset_t sys_sigmask (); -#define sigmask(SIG) (sys_sigmask (SIG)) -#endif /* ! defined (__GNUC__) */ - -#undef sigpause -#define sigpause(MASK) sigsuspend (&(MASK)) - -#define sigblock(SIG) sys_sigblock (SIG) -#define sigunblock(SIG) sys_sigunblock (SIG) -#ifndef sigsetmask -#define sigsetmask(SIG) sys_sigsetmask (SIG) -#endif -#undef signal -#define signal(SIG,ACT) sys_signal(SIG,ACT) - -/* Whether this is what all systems want or not, this is what - appears to be assumed in the source, for example data.c:arith_error. */ -typedef void (*signal_handler_t) (int); - -signal_handler_t sys_signal (int signal_number, signal_handler_t action); -sigset_t sys_sigblock (sigset_t new_mask); -sigset_t sys_sigunblock (sigset_t new_mask); -sigset_t sys_sigsetmask (sigset_t new_mask); -#if ! (defined TIOCNOTTY || defined USG5 || defined CYGWIN) -void croak (char *) NO_RETURN; -#endif - -#define sys_sigdel(MASK,SIG) sigdelset (&MASK,SIG) - -#define sigfree() sigsetmask (SIGEMPTYMASK) - -#if defined (SIGIO) && defined (BROKEN_SIGIO) -# undef SIGIO -#endif -/* Last user: m/ibmrs6000.h */ -#if defined (SIGPOLL) && defined (BROKEN_SIGPOLL) -#undef SIGPOLL -#endif -/* Last user: m/ibmrs6000.h */ -#if defined (SIGAIO) && defined (BROKEN_SIGAIO) -#undef SIGAIO -#endif -/* Last user: m/ibmrs6000.h */ -#if defined (SIGPTY) && defined (BROKEN_SIGPTY) -#undef SIGPTY -#endif - - -#if NSIG < NSIG_MINIMUM -# ifdef NSIG -# undef NSIG -# endif -# define NSIG NSIG_MINIMUM -#endif - -/* On bsd, [man says] kill does not accept a negative number to kill a pgrp. - Must do that using the killpg call. */ -#ifdef BSD_SYSTEM -#define EMACS_KILLPG(gid, signo) (killpg ( (gid), (signo))) -#else -#ifdef WINDOWSNT -#define EMACS_KILLPG(gid, signo) (kill (gid, signo)) -#else -#define EMACS_KILLPG(gid, signo) (kill (-(gid), (signo))) -#endif -#endif - -/* Define SIGCHLD as an alias for SIGCLD. There are many conditionals - testing SIGCHLD. */ -#ifdef SIGCLD -#ifndef SIGCHLD -#define SIGCHLD SIGCLD -#endif /* SIGCHLD */ -#endif /* ! defined (SIGCLD) */ - -#ifndef HAVE_STRSIGNAL -/* strsignal is in sysdep.c */ -char *strsignal (int); -#endif - -#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD -extern pthread_t main_thread; -#define SIGNAL_THREAD_CHECK(signo) \ - do { \ - if (!pthread_equal (pthread_self (), main_thread)) \ - { \ - /* POSIX says any thread can receive the signal. On GNU/Linux \ - that is not true, but for other systems (FreeBSD at least) \ - it is. So direct the signal to the correct thread and block \ - it from this thread. */ \ - sigset_t new_mask; \ - \ - sigemptyset (&new_mask); \ - sigaddset (&new_mask, signo); \ - pthread_sigmask (SIG_BLOCK, &new_mask, 0); \ - pthread_kill (main_thread, signo); \ - return; \ - } \ - } while (0) - -#else /* not FORWARD_SIGNAL_TO_MAIN_THREAD */ -#define SIGNAL_THREAD_CHECK(signo) -#endif /* not FORWARD_SIGNAL_TO_MAIN_THREAD */ +/* syssignal.h - System-dependent definitions for signals. + +Copyright (C) 1993, 1999, 2001-2013 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs. If not, see . */ + +#include +#include + +extern void init_signals (bool); + +#ifdef HAVE_PTHREAD +#include +/* If defined, asynchronous signals delivered to a non-main thread are + forwarded to the main thread. */ +#define FORWARD_SIGNAL_TO_MAIN_THREAD +#endif + +#if defined HAVE_TIMER_SETTIME && defined SIGEV_SIGNAL +# define HAVE_ITIMERSPEC +#endif + +#if (defined SIGPROF && !defined PROFILING \ + && (defined HAVE_SETITIMER || defined HAVE_ITIMERSPEC)) +# define PROFILER_CPU_SUPPORT +#endif + +extern sigset_t empty_mask; + +typedef void (*signal_handler_t) (int); + +extern void emacs_sigaction_init (struct sigaction *, signal_handler_t); +char const *safe_strsignal (int) ATTRIBUTE_CONST; + +#if NSIG < NSIG_MINIMUM +# undef NSIG +# define NSIG NSIG_MINIMUM +#endif + +#ifndef emacs_raise +# define emacs_raise(sig) raise (sig) +#endif + +#ifndef HAVE_STRSIGNAL +# define strsignal(sig) safe_strsignal (sig) +#endif + +void deliver_process_signal (int, signal_handler_t);