
/* Signal module -- many thanks to Lance Ellinghaus */

/* XXX Signals should be recorded per thread, now we have thread state. */

#include "Python.h"
#include "pycore_atomic.h"        // _Py_atomic_int
#include "pycore_call.h"          // _PyObject_Call()
#include "pycore_ceval.h"         // _PyEval_SignalReceived()
#include "pycore_emscripten_signal.h"  // _Py_CHECK_EMSCRIPTEN_SIGNALS
#include "pycore_fileutils.h"     // _Py_BEGIN_SUPPRESS_IPH
#include "pycore_frame.h"         // _PyInterpreterFrame
#include "pycore_moduleobject.h"  // _PyModule_GetState()
#include "pycore_pyerrors.h"      // _PyErr_SetString()
#include "pycore_pystate.h"       // _PyThreadState_GET()
#include "pycore_signal.h"        // _Py_RestoreSignals()

#ifndef MS_WINDOWS
#  include "posixmodule.h"        // _PyLong_FromUid()
#endif
#ifdef MS_WINDOWS
#  include "socketmodule.h"       // SOCKET_T
#endif

#ifdef MS_WINDOWS
#  ifdef HAVE_PROCESS_H
#    include <process.h>
#  endif
#endif

#ifdef HAVE_SIGNAL_H
#  include <signal.h>             // sigaction()
#endif
#ifdef HAVE_SYS_SYSCALL_H
#  include <sys/syscall.h>        // __NR_pidfd_send_signal
#endif
#ifdef HAVE_SYS_STAT_H
#  include <sys/stat.h>
#endif
#ifdef HAVE_SYS_TIME_H
#  include <sys/time.h>           // setitimer()
#endif

#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
#  define PYPTHREAD_SIGMASK
#endif

#if defined(PYPTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H)
#  include <pthread.h>
#endif

#ifndef SIG_ERR
#  define SIG_ERR ((PyOS_sighandler_t)(-1))
#endif

#include "clinic/signalmodule.c.h"

/*[clinic input]
module signal
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b0301a3bde5fe9d3]*/

#ifdef HAVE_SETSIG_T

/*[python input]

class sigset_t_converter(CConverter):
    type = 'sigset_t'
    converter = '_Py_Sigset_Converter'

[python start generated code]*/
/*[python end generated code: output=da39a3ee5e6b4b0d input=b5689d14466b6823]*/
#endif

/*
   NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS

   We want the following semantics:

   - only the main thread can set a signal handler
   - only the main thread runs the signal handler
   - signals can be delivered to any thread
   - any thread can get a signal handler

   I.e. we don't support "synchronous signals" like SIGFPE (catching
   this doesn't make much sense in Python anyway) nor do we support
   signals as a means of inter-thread communication, since not all
   thread implementations support that (at least our thread library
   doesn't).

   We still have the problem that in some implementations signals
   generated by the keyboard (e.g. SIGINT) are delivered to all
   threads (e.g. SGI), while in others (e.g. Solaris) such signals are
   delivered to one random thread. On Linux, signals are delivered to
   the main thread (unless the main thread is blocking the signal, for
   example because it's already handling the same signal).  Since we
   allow signals to be delivered to any thread, this works fine. The
   only oddity is that the thread executing the Python signal handler
   may not be the thread that received the signal.
*/

#define Handlers _PyRuntime.signals.handlers
#define wakeup _PyRuntime.signals.wakeup
#define is_tripped _PyRuntime.signals.is_tripped

// State shared by all Python interpreters
typedef struct _signals_runtime_state signal_state_t;
#define signal_global_state _PyRuntime.signals

#if defined(HAVE_GETITIMER) || defined(HAVE_SETITIMER)
#  define PYHAVE_ITIMER_ERROR
#endif

typedef struct {
    PyObject *default_handler;  // borrowed ref (signal_global_state)
    PyObject *ignore_handler;  // borrowed ref (signal_global_state)
#ifdef PYHAVE_ITIMER_ERROR
    PyObject *itimer_error;
#endif
    PyTypeObject *siginfo_type;
} _signal_module_state;


Py_LOCAL_INLINE(PyObject *)
get_handler(int i)
{
    return (PyObject *)_Py_atomic_load(&Handlers[i].func);
}

Py_LOCAL_INLINE(void)
set_handler(int i, PyObject* func)
{
    _Py_atomic_store(&Handlers[i].func, (uintptr_t)func);
}


static inline _signal_module_state*
get_signal_state(PyObject *module)
{
    void *state = _PyModule_GetState(module);
    assert(state != NULL);
    return (_signal_module_state *)state;
}


static inline int
compare_handler(PyObject *func, PyObject *dfl_ign_handler)
{
    // See https://github.com/python/cpython/pull/102399
    if (func == NULL || dfl_ign_handler == NULL) {
        return 0;
    }
    assert(PyLong_CheckExact(dfl_ign_handler));
    if (!PyLong_CheckExact(func)) {
        return 0;
    }
    // Assume that comparison of two PyLong objects will never fail.
    return PyObject_RichCompareBool(func, dfl_ign_handler, Py_EQ) == 1;
}

#ifdef HAVE_SETITIMER
/* auxiliary function for setitimer */
static int
timeval_from_double(PyObject *obj, struct timeval *tv)
{
    if (obj == NULL) {
        tv->tv_sec = 0;
        tv->tv_usec = 0;
        return 0;
    }

    _PyTime_t t;
    if (_PyTime_FromSecondsObject(&t, obj, _PyTime_ROUND_CEILING) < 0) {
        return -1;
    }
    return _PyTime_AsTimeval(t, tv, _PyTime_ROUND_CEILING);
}
#endif

#if defined(HAVE_SETITIMER) || defined(HAVE_GETITIMER)
/* auxiliary functions for get/setitimer */
Py_LOCAL_INLINE(double)
double_from_timeval(struct timeval *tv)
{
    return tv->tv_sec + (double)(tv->tv_usec / 1000000.0);
}

static PyObject *
itimer_retval(struct itimerval *iv)
{
    PyObject *r, *v;

    r = PyTuple_New(2);
    if (r == NULL)
        return NULL;

    if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_value)))) {
        Py_DECREF(r);
        return NULL;
    }

    PyTuple_SET_ITEM(r, 0, v);

    if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_interval)))) {
        Py_DECREF(r);
        return NULL;
    }

    PyTuple_SET_ITEM(r, 1, v);

    return r;
}
#endif

/*[clinic input]
signal.default_int_handler
    signalnum: int
    frame: object
    /

The default handler for SIGINT installed by Python.

It raises KeyboardInterrupt.
[clinic start generated code]*/

static PyObject *
signal_default_int_handler_impl(PyObject *module, int signalnum,
                                PyObject *frame)
/*[clinic end generated code: output=bb11c2eb115ace4e input=efcd4a56a207acfd]*/
{
    PyErr_SetNone(PyExc_KeyboardInterrupt);
    return NULL;
}


static int
report_wakeup_write_error(void *data)
{
    int save_errno = errno;
    errno = (int) (intptr_t) data;
    PyObject *exc = PyErr_GetRaisedException();
    PyErr_SetFromErrno(PyExc_OSError);
    _PyErr_WriteUnraisableMsg("when trying to write to the signal wakeup fd",
                              NULL);
    PyErr_SetRaisedException(exc);
    errno = save_errno;
    return 0;
}

#ifdef MS_WINDOWS
static int
report_wakeup_send_error(void* data)
{
    int send_errno = (int) (intptr_t) data;

    PyObject *exc = PyErr_GetRaisedException();
    /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
       recognizes the error codes used by both GetLastError() and
       WSAGetLastError */
    PyErr_SetExcFromWindowsErr(PyExc_OSError, send_errno);
    _PyErr_WriteUnraisableMsg("when trying to send to the signal wakeup fd", NULL);
    PyErr_SetRaisedException(exc);
    return 0;
}
#endif   /* MS_WINDOWS */

static void
trip_signal(int sig_num)
{
    _Py_atomic_store_relaxed(&Handlers[sig_num].tripped, 1);

    /* Set is_tripped after setting .tripped, as it gets
       cleared in PyErr_CheckSignals() before .tripped. */
    _Py_atomic_store(&is_tripped, 1);

    /* Signals are always handled by the main interpreter */
    PyInterpreterState *interp = _PyInterpreterState_Main();

    /* Notify ceval.c */
    _PyEval_SignalReceived(interp);

    /* And then write to the wakeup fd *after* setting all the globals and
       doing the _PyEval_SignalReceived. We used to write to the wakeup fd
       and then set the flag, but this allowed the following sequence of events
       (especially on windows, where trip_signal may run in a new thread):

       - main thread blocks on select([wakeup.fd], ...)
       - signal arrives
       - trip_signal writes to the wakeup fd
       - the main thread wakes up
       - the main thread checks the signal flags, sees that they're unset
       - the main thread empties the wakeup fd
       - the main thread goes back to sleep
       - trip_signal sets the flags to request the Python-level signal handler
         be run
       - the main thread doesn't notice, because it's asleep

       See bpo-30038 for more details.
    */

    int fd = wakeup.fd;
    if (fd != INVALID_FD) {
        unsigned char byte = (unsigned char)sig_num;
#ifdef MS_WINDOWS
        if (wakeup.use_send) {
            Py_ssize_t rc = send(fd, &byte, 1, 0);

            if (rc < 0) {
                int last_error = GetLastError();
                if (wakeup.warn_on_full_buffer ||
                    last_error != WSAEWOULDBLOCK)
                {
                    /* _PyEval_AddPendingCall() isn't signal-safe, but we
                       still use it for this exceptional case. */
                    _PyEval_AddPendingCall(interp,
                                           report_wakeup_send_error,
                                           (void *)(intptr_t) last_error,
                                           1);
                }
            }
        }
        else
#endif
        {
            /* _Py_write_noraise() retries write() if write() is interrupted by
               a signal (fails with EINTR). */
            Py_ssize_t rc = _Py_write_noraise(fd, &byte, 1);

            if (rc < 0) {
                if (wakeup.warn_on_full_buffer ||
                    (errno != EWOULDBLOCK && errno != EAGAIN))
                {
                    /* _PyEval_AddPendingCall() isn't signal-safe, but we
                       still use it for this exceptional case. */
                    _PyEval_AddPendingCall(interp,
                                           report_wakeup_write_error,
                                           (void *)(intptr_t)errno,
                                           1);
                }
            }
        }
    }
}

static void
signal_handler(int sig_num)
{
    int save_errno = errno;

    trip_signal(sig_num);

#ifndef HAVE_SIGACTION
#ifdef SIGCHLD
    /* To avoid infinite recursion, this signal remains
       reset until explicit re-instated.
       Don't clear the 'func' field as it is our pointer
       to the Python handler... */
    if (sig_num != SIGCHLD)
#endif
    /* If the handler was not set up with sigaction, reinstall it.  See
     * Python/pylifecycle.c for the implementation of PyOS_setsig which
     * makes this true.  See also issue8354. */
    PyOS_setsig(sig_num, signal_handler);
#endif

    /* Issue #10311: asynchronously executing signal handlers should not
       mutate errno under the feet of unsuspecting C code. */
    errno = save_errno;

#ifdef MS_WINDOWS
    if (sig_num == SIGINT) {
        signal_state_t *state = &signal_global_state;
        SetEvent((HANDLE)state->sigint_event);
    }
#endif
}


#ifdef HAVE_ALARM

/*[clinic input]
signal.alarm -> long

    seconds: int
    /

Arrange for SIGALRM to arrive after the given number of seconds.
[clinic start generated code]*/

static long
signal_alarm_impl(PyObject *module, int seconds)
/*[clinic end generated code: output=144232290814c298 input=0d5e97e0e6f39e86]*/
{
    /* alarm() returns the number of seconds remaining */
    return (long)alarm(seconds);
}

#endif

#ifdef HAVE_PAUSE

/*[clinic input]
signal.pause

Wait until a signal arrives.
[clinic start generated code]*/

static PyObject *
signal_pause_impl(PyObject *module)
/*[clinic end generated code: output=391656788b3c3929 input=f03de0f875752062]*/
{
    Py_BEGIN_ALLOW_THREADS
    (void)pause();
    Py_END_ALLOW_THREADS
    /* make sure that any exceptions that got raised are propagated
     * back into Python
     */
    if (PyErr_CheckSignals())
        return NULL;

    Py_RETURN_NONE;
}

#endif

/*[clinic input]
signal.raise_signal

    signalnum: int
    /

Send a signal to the executing process.
[clinic start generated code]*/

static PyObject *
signal_raise_signal_impl(PyObject *module, int signalnum)
/*[clinic end generated code: output=e2b014220aa6111d input=e90c0f9a42358de6]*/
{
    int err;
    Py_BEGIN_ALLOW_THREADS
    _Py_BEGIN_SUPPRESS_IPH
    err = raise(signalnum);
    _Py_END_SUPPRESS_IPH
    Py_END_ALLOW_THREADS

    if (err) {
        return PyErr_SetFromErrno(PyExc_OSError);
    }

    // If the current thread can handle signals, handle immediately
    // the raised signal.
    if (PyErr_CheckSignals()) {
        return NULL;
    }

    Py_RETURN_NONE;
}

/*[clinic input]
signal.signal

    signalnum: int
    handler:   object
    /

Set the action for the given signal.

The action can be SIG_DFL, SIG_IGN, or a callable Python object.
The previous action is returned.  See getsignal() for possible return values.

*** IMPORTANT NOTICE ***
A signal handler function is called with two arguments:
the first is the signal number, the second is the interrupted stack frame.
[clinic start generated code]*/

static PyObject *
signal_signal_impl(PyObject *module, int signalnum, PyObject *handler)
/*[clinic end generated code: output=b44cfda43780f3a1 input=deee84af5fa0432c]*/
{
    _signal_module_state *modstate = get_signal_state(module);
    PyObject *old_handler;
    void (*func)(int);
#ifdef MS_WINDOWS
    /* Validate that signalnum is one of the allowable signals */
    switch (signalnum) {
        case SIGABRT: break;
#ifdef SIGBREAK
        /* Issue #10003: SIGBREAK is not documented as permitted, but works
           and corresponds to CTRL_BREAK_EVENT. */
        case SIGBREAK: break;
#endif
        case SIGFPE: break;
        case SIGILL: break;
        case SIGINT: break;
        case SIGSEGV: break;
        case SIGTERM: break;
        default:
            PyErr_SetString(PyExc_ValueError, "invalid signal value");
            return NULL;
    }
#endif

    PyThreadState *tstate = _PyThreadState_GET();
    if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
        _PyErr_SetString(tstate, PyExc_ValueError,
                         "signal only works in main thread "
                         "of the main interpreter");
        return NULL;
    }
    if (signalnum < 1 || signalnum >= Py_NSIG) {
        _PyErr_SetString(tstate, PyExc_ValueError,
                         "signal number out of range");
        return NULL;
    }
    if (PyCallable_Check(handler)) {
        func = signal_handler;
    } else if (compare_handler(handler, modstate->ignore_handler)) {
        func = SIG_IGN;
    } else if (compare_handler(handler, modstate->default_handler)) {
        func = SIG_DFL;
    } else {
        _PyErr_SetString(tstate, PyExc_TypeError,
                         "signal handler must be signal.SIG_IGN, "
                         "signal.SIG_DFL, or a callable object");
        return NULL;
    }

    /* Check for pending signals before changing signal handler */
    if (_PyErr_CheckSignalsTstate(tstate)) {
        return NULL;
    }
    if (PyOS_setsig(signalnum, func) == SIG_ERR) {
        PyErr_SetFromErrno(PyExc_OSError);
        return NULL;
    }

    old_handler = get_handler(signalnum);
    set_handler(signalnum, Py_NewRef(handler));

    if (old_handler != NULL) {
        return old_handler;
    }
    else {
        Py_RETURN_NONE;
    }
}


/*[clinic input]
signal.getsignal

    signalnum: int
    /

Return the current action for the given signal.

The return value can be:
  SIG_IGN -- if the signal is being ignored
  SIG_DFL -- if the default action for the signal is in effect
  None    -- if an unknown handler is in effect
  anything else -- the callable Python object used as a handler
[clinic start generated code]*/

static PyObject *
signal_getsignal_impl(PyObject *module, int signalnum)
/*[clinic end generated code: output=35b3e0e796fd555e input=ac23a00f19dfa509]*/
{
    PyObject *old_handler;
    if (signalnum < 1 || signalnum >= Py_NSIG) {
        PyErr_SetString(PyExc_ValueError,
                        "signal number out of range");
        return NULL;
    }
    old_handler = get_handler(signalnum);
    if (old_handler != NULL) {
        return Py_NewRef(old_handler);
    }
    else {
        Py_RETURN_NONE;
    }
}


/*[clinic input]
signal.strsignal

    signalnum: int
    /

Return the system description of the given signal.

Returns the description of signal *signalnum*, such as "Interrupt"
for :const:`SIGINT`. Returns :const:`None` if *signalnum* has no
description. Raises :exc:`ValueError` if *signalnum* is invalid.
[clinic start generated code]*/

static PyObject *
signal_strsignal_impl(PyObject *module, int signalnum)
/*[clinic end generated code: output=44e12e1e3b666261 input=238b335847778bc0]*/
{
    const char *res;

    if (signalnum < 1 || signalnum >= Py_NSIG) {
        PyErr_SetString(PyExc_ValueError,
                "signal number out of range");
        return NULL;
    }

#ifndef HAVE_STRSIGNAL
    switch (signalnum) {
        /* Though being a UNIX, HP-UX does not provide strsignal(3). */
#ifndef MS_WINDOWS
        case SIGHUP:
            res = "Hangup";
            break;
        case SIGALRM:
            res = "Alarm clock";
            break;
        case SIGPIPE:
            res = "Broken pipe";
            break;
        case SIGQUIT:
            res = "Quit";
            break;
        case SIGCHLD:
            res = "Child exited";
            break;
#endif
        /* Custom redefinition of POSIX signals allowed on Windows. */
        case SIGINT:
            res = "Interrupt";
            break;
        case SIGILL:
            res = "Illegal instruction";
            break;
        case SIGABRT:
            res = "Aborted";
            break;
        case SIGFPE:
            res = "Floating point exception";
            break;
        case SIGSEGV:
            res = "Segmentation fault";
            break;
        case SIGTERM:
            res = "Terminated";
            break;
        default:
            Py_RETURN_NONE;
    }
#else
    errno = 0;
    res = strsignal(signalnum);

    if (errno || res == NULL || strstr(res, "Unknown signal") != NULL)
        Py_RETURN_NONE;
#endif

    return Py_BuildValue("s", res);
}

#ifdef HAVE_SIGINTERRUPT

/*[clinic input]
signal.siginterrupt

    signalnum: int
    flag:      int
    /

Change system call restart behaviour.

If flag is False, system calls will be restarted when interrupted by
signal sig, else system calls will be interrupted.
[clinic start generated code]*/

static PyObject *
signal_siginterrupt_impl(PyObject *module, int signalnum, int flag)
/*[clinic end generated code: output=063816243d85dd19 input=4160acacca3e2099]*/
{
    if (signalnum < 1 || signalnum >= Py_NSIG) {
        PyErr_SetString(PyExc_ValueError,
                        "signal number out of range");
        return NULL;
    }
#ifdef HAVE_SIGACTION
    struct sigaction act;
    (void) sigaction(signalnum, NULL, &act);
    if (flag) {
        act.sa_flags &= ~SA_RESTART;
    }
    else {
        act.sa_flags |= SA_RESTART;
    }
    if (sigaction(signalnum, &act, NULL) < 0) {
#else
    if (siginterrupt(signalnum, flag) < 0) {
#endif
        PyErr_SetFromErrno(PyExc_OSError);
        return NULL;
    }
    Py_RETURN_NONE;
}

#endif


static PyObject*
signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds)
{
    struct _Py_stat_struct status;
    static char *kwlist[] = {
        "", "warn_on_full_buffer", NULL,
    };
    int warn_on_full_buffer = 1;
#ifdef MS_WINDOWS
    PyObject *fdobj;
    SOCKET_T sockfd, old_sockfd;
    int res;
    int res_size = sizeof res;
    PyObject *mod;
    int is_socket;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|$p:set_wakeup_fd", kwlist,
                                     &fdobj, &warn_on_full_buffer))
        return NULL;

    sockfd = PyLong_AsSocket_t(fdobj);
    if (sockfd == (SOCKET_T)(-1) && PyErr_Occurred())
        return NULL;
#else
    int fd;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "i|$p:set_wakeup_fd", kwlist,
                                     &fd, &warn_on_full_buffer))
        return NULL;
#endif

    PyThreadState *tstate = _PyThreadState_GET();
    if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
        _PyErr_SetString(tstate, PyExc_ValueError,
                         "set_wakeup_fd only works in main thread "
                         "of the main interpreter");
        return NULL;
    }

#ifdef MS_WINDOWS
    is_socket = 0;
    if (sockfd != INVALID_FD) {
        /* Import the _socket module to call WSAStartup() */
        mod = PyImport_ImportModule("_socket");
        if (mod == NULL)
            return NULL;
        Py_DECREF(mod);

        /* test the socket */
        if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
                       (char *)&res, &res_size) != 0) {
            int fd, err;

            err = WSAGetLastError();
            if (err != WSAENOTSOCK) {
                PyErr_SetExcFromWindowsErr(PyExc_OSError, err);
                return NULL;
            }

            fd = (int)sockfd;
            if ((SOCKET_T)fd != sockfd) {
                _PyErr_SetString(tstate, PyExc_ValueError, "invalid fd");
                return NULL;
            }

            if (_Py_fstat(fd, &status) != 0) {
                return NULL;
            }

            /* on Windows, a file cannot be set to non-blocking mode */
        }
        else {
            is_socket = 1;

            /* Windows does not provide a function to test if a socket
               is in non-blocking mode */
        }
    }

    old_sockfd = wakeup.fd;
    wakeup.fd = Py_SAFE_DOWNCAST(sockfd, SOCKET_T, int);
    wakeup.warn_on_full_buffer = warn_on_full_buffer;
    wakeup.use_send = is_socket;

    if (old_sockfd != INVALID_FD)
        return PyLong_FromSocket_t(old_sockfd);
    else
        return PyLong_FromLong(-1);
#else
    if (fd != -1) {
        int blocking;

        if (_Py_fstat(fd, &status) != 0)
            return NULL;

        blocking = _Py_get_blocking(fd);
        if (blocking < 0)
            return NULL;
        if (blocking) {
            _PyErr_Format(tstate, PyExc_ValueError,
                          "the fd %i must be in non-blocking mode",
                          fd);
            return NULL;
        }
    }

    int old_fd = wakeup.fd;
    wakeup.fd = fd;
    wakeup.warn_on_full_buffer = warn_on_full_buffer;

    return PyLong_FromLong(old_fd);
#endif
}

PyDoc_STRVAR(set_wakeup_fd_doc,
"set_wakeup_fd(fd, *, warn_on_full_buffer=True) -> fd\n\
\n\
Sets the fd to be written to (with the signal number) when a signal\n\
comes in.  A library can use this to wakeup select or poll.\n\
The previous fd or -1 is returned.\n\
\n\
The fd must be non-blocking.");

/* C API for the same, without all the error checking */
int
PySignal_SetWakeupFd(int fd)
{
    if (fd < 0) {
        fd = -1;
    }

    int old_fd = wakeup.fd;
    wakeup.fd = fd;
    wakeup.warn_on_full_buffer = 1;
    return old_fd;
}


#ifdef HAVE_SETITIMER
/*[clinic input]
signal.setitimer

    which:    int
    seconds:  object
    interval: object(c_default="NULL") = 0.0
    /

Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL or ITIMER_PROF).

The timer will fire after value seconds and after that every interval seconds.
The itimer can be cleared by setting seconds to zero.

Returns old values as a tuple: (delay, interval).
[clinic start generated code]*/

static PyObject *
signal_setitimer_impl(PyObject *module, int which, PyObject *seconds,
                      PyObject *interval)
/*[clinic end generated code: output=65f9dcbddc35527b input=de43daf194e6f66f]*/
{
    _signal_module_state *modstate = get_signal_state(module);

    struct itimerval new;
    if (timeval_from_double(seconds, &new.it_value) < 0) {
        return NULL;
    }
    if (timeval_from_double(interval, &new.it_interval) < 0) {
        return NULL;
    }

    /* Let OS check "which" value */
    struct itimerval old;
    if (setitimer(which, &new, &old) != 0) {
        PyErr_SetFromErrno(modstate->itimer_error);
        return NULL;
    }

    return itimer_retval(&old);
}
#endif  // HAVE_SETITIMER


#ifdef HAVE_GETITIMER
/*[clinic input]
signal.getitimer

    which:    int
    /

Returns current value of given itimer.
[clinic start generated code]*/

static PyObject *
signal_getitimer_impl(PyObject *module, int which)
/*[clinic end generated code: output=9e053175d517db40 input=f7d21d38f3490627]*/
{
    _signal_module_state *modstate = get_signal_state(module);

    struct itimerval old;
    if (getitimer(which, &old) != 0) {
        PyErr_SetFromErrno(modstate->itimer_error);
        return NULL;
    }

    return itimer_retval(&old);
}
#endif // HAVE_GETITIMER


#ifdef HAVE_SIGSET_T
#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
static PyObject*
sigset_to_set(sigset_t mask)
{
    PyObject *signum, *result;
    int sig;

    result = PySet_New(0);
    if (result == NULL)
        return NULL;

    for (sig = 1; sig < Py_NSIG; sig++) {
        if (sigismember(&mask, sig) != 1)
            continue;

        /* Handle the case where it is a member by adding the signal to
           the result list.  Ignore the other cases because they mean the
           signal isn't a member of the mask or the signal was invalid,
           and an invalid signal must have been our fault in constructing
           the loop boundaries. */
        signum = PyLong_FromLong(sig);
        if (signum == NULL) {
            Py_DECREF(result);
            return NULL;
        }
        if (PySet_Add(result, signum) == -1) {
            Py_DECREF(signum);
            Py_DECREF(result);
            return NULL;
        }
        Py_DECREF(signum);
    }
    return result;
}
#endif

#ifdef PYPTHREAD_SIGMASK

/*[clinic input]
signal.pthread_sigmask

    how:  int
    mask: sigset_t
    /

Fetch and/or change the signal mask of the calling thread.
[clinic start generated code]*/

static PyObject *
signal_pthread_sigmask_impl(PyObject *module, int how, sigset_t mask)
/*[clinic end generated code: output=0562c0fb192981a8 input=85bcebda442fa77f]*/
{
    sigset_t previous;
    int err;

    err = pthread_sigmask(how, &mask, &previous);
    if (err != 0) {
        errno = err;
        PyErr_SetFromErrno(PyExc_OSError);
        return NULL;
    }

    /* if signals was unblocked, signal handlers have been called */
    if (PyErr_CheckSignals())
        return NULL;

    return sigset_to_set(previous);
}

#endif   /* #ifdef PYPTHREAD_SIGMASK */


#ifdef HAVE_SIGPENDING

/*[clinic input]
signal.sigpending

Examine pending signals.

Returns a set of signal numbers that are pending for delivery to
the calling thread.
[clinic start generated code]*/

static PyObject *
signal_sigpending_impl(PyObject *module)
/*[clinic end generated code: output=53375ffe89325022 input=e0036c016f874e29]*/
{
    int err;
    sigset_t mask;
    err = sigpending(&mask);
    if (err)
        return PyErr_SetFromErrno(PyExc_OSError);
    return sigset_to_set(mask);
}

#endif   /* #ifdef HAVE_SIGPENDING */


#ifdef HAVE_SIGWAIT

/*[clinic input]
signal.sigwait

    sigset: sigset_t
    /

Wait for a signal.

Suspend execution of the calling thread until the delivery of one of the
signals specified in the signal set sigset.  The function accepts the signal
and returns the signal number.
[clinic start generated code]*/

static PyObject *
signal_sigwait_impl(PyObject *module, sigset_t sigset)
/*[clinic end generated code: output=f43770699d682f96 input=a6fbd47b1086d119]*/
{
    int err, signum;

    Py_BEGIN_ALLOW_THREADS
    err = sigwait(&sigset, &signum);
    Py_END_ALLOW_THREADS
    if (err) {
        errno = err;
        return PyErr_SetFromErrno(PyExc_OSError);
    }

    return PyLong_FromLong(signum);
}

#endif   /* #ifdef HAVE_SIGWAIT */
#endif   /* #ifdef HAVE_SIGSET_T */

#if (defined(HAVE_SIGFILLSET) && defined(HAVE_SIGSET_T)) || defined(MS_WINDOWS)

/*[clinic input]
signal.valid_signals

Return a set of valid signal numbers on this platform.

The signal numbers returned by this function can be safely passed to
functions like `pthread_sigmask`.
[clinic start generated code]*/

static PyObject *
signal_valid_signals_impl(PyObject *module)
/*[clinic end generated code: output=1609cffbcfcf1314 input=86a3717ff25288f2]*/
{
#ifdef MS_WINDOWS
#ifdef SIGBREAK
    PyObject *tup = Py_BuildValue("(iiiiiii)", SIGABRT, SIGBREAK, SIGFPE,
                                  SIGILL, SIGINT, SIGSEGV, SIGTERM);
#else
    PyObject *tup = Py_BuildValue("(iiiiii)", SIGABRT, SIGFPE, SIGILL,
                                  SIGINT, SIGSEGV, SIGTERM);
#endif
    if (tup == NULL) {
        return NULL;
    }
    PyObject *set = PySet_New(tup);
    Py_DECREF(tup);
    return set;
#else
    sigset_t mask;
    if (sigemptyset(&mask) || sigfillset(&mask)) {
        return PyErr_SetFromErrno(PyExc_OSError);
    }
    return sigset_to_set(mask);
#endif
}

#endif   /* #if (defined(HAVE_SIGFILLSET) && defined(HAVE_SIGSET_T)) || defined(MS_WINDOWS) */



#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
static PyStructSequence_Field struct_siginfo_fields[] = {
    {"si_signo",        "signal number"},
    {"si_code",         "signal code"},
    {"si_errno",        "errno associated with this signal"},
    {"si_pid",          "sending process ID"},
    {"si_uid",          "real user ID of sending process"},
    {"si_status",       "exit value or signal"},
    {"si_band",         "band event for SIGPOLL"},
    {0}
};

PyDoc_STRVAR(struct_siginfo__doc__,
"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
This object may be accessed either as a tuple of\n\
(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
or via the attributes si_signo, si_code, and so on.");

static PyStructSequence_Desc struct_siginfo_desc = {
    "signal.struct_siginfo",           /* name */
    struct_siginfo__doc__,       /* doc */
    struct_siginfo_fields,       /* fields */
    7          /* n_in_sequence */
};


static PyObject *
fill_siginfo(_signal_module_state *state, siginfo_t *si)
{
    PyObject *result = PyStructSequence_New(state->siginfo_type);
    if (!result)
        return NULL;

    PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
    PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
#ifdef __VXWORKS__
    PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(0L));
    PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(0L));
    PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(0L));
    PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(0L));
#else
    PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
    PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
    PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
    PyStructSequence_SET_ITEM(result, 5,
                                PyLong_FromLong((long)(si->si_status)));
#endif
#ifdef HAVE_SIGINFO_T_SI_BAND
    PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
#else
    PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(0L));
#endif
    if (PyErr_Occurred()) {
        Py_DECREF(result);
        return NULL;
    }

    return result;
}
#endif

#ifdef HAVE_SIGSET_T
#ifdef HAVE_SIGWAITINFO

/*[clinic input]
signal.sigwaitinfo

    sigset: sigset_t
    /

Wait synchronously until one of the signals in *sigset* is delivered.

Returns a struct_siginfo containing information about the signal.
[clinic start generated code]*/

static PyObject *
signal_sigwaitinfo_impl(PyObject *module, sigset_t sigset)
/*[clinic end generated code: output=1eb2f1fa236fdbca input=3d1a7e1f27fc664c]*/
{
    siginfo_t si;
    int err;
    int async_err = 0;

    do {
        Py_BEGIN_ALLOW_THREADS
        err = sigwaitinfo(&sigset, &si);
        Py_END_ALLOW_THREADS
    } while (err == -1
             && errno == EINTR && !(async_err = PyErr_CheckSignals()));
    if (err == -1)
        return (!async_err) ? PyErr_SetFromErrno(PyExc_OSError) : NULL;

    _signal_module_state *state = get_signal_state(module);
    return fill_siginfo(state, &si);
}

#endif   /* #ifdef HAVE_SIGWAITINFO */

#ifdef HAVE_SIGTIMEDWAIT

/*[clinic input]
signal.sigtimedwait

    sigset: sigset_t
    timeout as timeout_obj: object
    /

Like sigwaitinfo(), but with a timeout.

The timeout is specified in seconds, with floating point numbers allowed.
[clinic start generated code]*/

static PyObject *
signal_sigtimedwait_impl(PyObject *module, sigset_t sigset,
                         PyObject *timeout_obj)
/*[clinic end generated code: output=59c8971e8ae18a64 input=87fd39237cf0b7ba]*/
{
    _PyTime_t timeout;
    if (_PyTime_FromSecondsObject(&timeout,
                                  timeout_obj, _PyTime_ROUND_CEILING) < 0)
        return NULL;

    if (timeout < 0) {
        PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
        return NULL;
    }

    _PyTime_t deadline = _PyDeadline_Init(timeout);
    siginfo_t si;

    do {
        struct timespec ts;
        if (_PyTime_AsTimespec(timeout, &ts) < 0) {
            return NULL;
        }

        int res;
        Py_BEGIN_ALLOW_THREADS
        res = sigtimedwait(&sigset, &si, &ts);
        Py_END_ALLOW_THREADS

        if (res != -1)
            break;

        if (errno != EINTR) {
            if (errno == EAGAIN)
                Py_RETURN_NONE;
            else
                return PyErr_SetFromErrno(PyExc_OSError);
        }

        /* sigtimedwait() was interrupted by a signal (EINTR) */
        if (PyErr_CheckSignals())
            return NULL;

        timeout = _PyDeadline_Get(deadline);
        if (timeout < 0) {
            break;
        }
    } while (1);

    _signal_module_state *state = get_signal_state(module);
    return fill_siginfo(state, &si);
}

#endif   /* #ifdef HAVE_SIGTIMEDWAIT */
#endif   /* #ifdef HAVE_SIGSET_T */


#if defined(HAVE_PTHREAD_KILL)

/*[clinic input]
signal.pthread_kill

    thread_id:  unsigned_long(bitwise=True)
    signalnum:  int
    /

Send a signal to a thread.
[clinic start generated code]*/

static PyObject *
signal_pthread_kill_impl(PyObject *module, unsigned long thread_id,
                         int signalnum)
/*[clinic end generated code: output=7629919b791bc27f input=1d901f2c7bb544ff]*/
{
    int err;

    if (PySys_Audit("signal.pthread_kill", "ki", thread_id, signalnum) < 0) {
        return NULL;
    }

    err = pthread_kill((pthread_t)thread_id, signalnum);
    if (err != 0) {
        errno = err;
        PyErr_SetFromErrno(PyExc_OSError);
        return NULL;
    }

    /* the signal may have been send to the current thread */
    if (PyErr_CheckSignals())
        return NULL;

    Py_RETURN_NONE;
}

#endif   /* #if defined(HAVE_PTHREAD_KILL) */


#if defined(__linux__) && defined(__NR_pidfd_send_signal)
/*[clinic input]
signal.pidfd_send_signal

    pidfd: int
    signalnum: int
    siginfo: object = None
    flags: int = 0
    /

Send a signal to a process referred to by a pid file descriptor.
[clinic start generated code]*/

static PyObject *
signal_pidfd_send_signal_impl(PyObject *module, int pidfd, int signalnum,
                              PyObject *siginfo, int flags)
/*[clinic end generated code: output=2d59f04a75d9cbdf input=2a6543a1f4ac2000]*/

{
    if (siginfo != Py_None) {
        PyErr_SetString(PyExc_TypeError, "siginfo must be None");
        return NULL;
    }
    if (syscall(__NR_pidfd_send_signal, pidfd, signalnum, NULL, flags) < 0) {
        PyErr_SetFromErrno(PyExc_OSError);
        return NULL;
    }
    Py_RETURN_NONE;
}
#endif



/* List of functions defined in the module -- some of the methoddefs are
   defined to nothing if the corresponding C function is not available. */
static PyMethodDef signal_methods[] = {
    SIGNAL_DEFAULT_INT_HANDLER_METHODDEF
    SIGNAL_ALARM_METHODDEF
    SIGNAL_SETITIMER_METHODDEF
    SIGNAL_GETITIMER_METHODDEF
    SIGNAL_SIGNAL_METHODDEF
    SIGNAL_RAISE_SIGNAL_METHODDEF
    SIGNAL_STRSIGNAL_METHODDEF
    SIGNAL_GETSIGNAL_METHODDEF
    {"set_wakeup_fd", _PyCFunction_CAST(signal_set_wakeup_fd), METH_VARARGS | METH_KEYWORDS, set_wakeup_fd_doc},
    SIGNAL_SIGINTERRUPT_METHODDEF
    SIGNAL_PAUSE_METHODDEF
    SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF
    SIGNAL_PTHREAD_KILL_METHODDEF
    SIGNAL_PTHREAD_SIGMASK_METHODDEF
    SIGNAL_SIGPENDING_METHODDEF
    SIGNAL_SIGWAIT_METHODDEF
    SIGNAL_SIGWAITINFO_METHODDEF
    SIGNAL_SIGTIMEDWAIT_METHODDEF
#if defined(HAVE_SIGFILLSET) || defined(MS_WINDOWS)
    SIGNAL_VALID_SIGNALS_METHODDEF
#endif
    {NULL, NULL}           /* sentinel */
};


PyDoc_STRVAR(module_doc,
"This module provides mechanisms to use signal handlers in Python.\n\
\n\
Functions:\n\
\n\
alarm() -- cause SIGALRM after a specified time [Unix only]\n\
setitimer() -- cause a signal (described below) after a specified\n\
               float time and the timer may restart then [Unix only]\n\
getitimer() -- get current value of timer [Unix only]\n\
signal() -- set the action for a given signal\n\
getsignal() -- get the signal action for a given signal\n\
pause() -- wait until a signal arrives [Unix only]\n\
default_int_handler() -- default SIGINT handler\n\
\n\
signal constants:\n\
SIG_DFL -- used to refer to the system default handler\n\
SIG_IGN -- used to ignore the signal\n\
NSIG -- number of defined signals\n\
SIGINT, SIGTERM, etc. -- signal numbers\n\
\n\
itimer constants:\n\
ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
               expiration\n\
ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
               and delivers SIGVTALRM upon expiration\n\
ITIMER_PROF -- decrements both when the process is executing and\n\
               when the system is executing on behalf of the process.\n\
               Coupled with ITIMER_VIRTUAL, this timer is usually\n\
               used to profile the time spent by the application\n\
               in user and kernel space. SIGPROF is delivered upon\n\
               expiration.\n\
\n\n\
*** IMPORTANT NOTICE ***\n\
A signal handler function is called with two arguments:\n\
the first is the signal number, the second is the interrupted stack frame.");



static int
signal_add_constants(PyObject *module)
{
    if (PyModule_AddIntConstant(module, "NSIG", Py_NSIG) < 0) {
        return -1;
    }

#define ADD_INT_MACRO(macro) \
    if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \
        return -1; \
    }

    // SIG_xxx pthread_sigmask() constants
#ifdef SIG_BLOCK
    ADD_INT_MACRO(SIG_BLOCK);
#endif
#ifdef SIG_UNBLOCK
    ADD_INT_MACRO(SIG_UNBLOCK);
#endif
#ifdef SIG_SETMASK
    ADD_INT_MACRO(SIG_SETMASK);
#endif

    // SIGxxx signal number constants
#ifdef SIGHUP
    ADD_INT_MACRO(SIGHUP);
#endif
#ifdef SIGINT
    ADD_INT_MACRO(SIGINT);
#endif
#ifdef SIGBREAK
    ADD_INT_MACRO(SIGBREAK);
#endif
#ifdef SIGQUIT
    ADD_INT_MACRO(SIGQUIT);
#endif
#ifdef SIGILL
    ADD_INT_MACRO(SIGILL);
#endif
#ifdef SIGTRAP
    ADD_INT_MACRO(SIGTRAP);
#endif
#ifdef SIGIOT
    ADD_INT_MACRO(SIGIOT);
#endif
#ifdef SIGABRT
    ADD_INT_MACRO(SIGABRT);
#endif
#ifdef SIGEMT
    ADD_INT_MACRO(SIGEMT);
#endif
#ifdef SIGFPE
    ADD_INT_MACRO(SIGFPE);
#endif
#ifdef SIGKILL
    ADD_INT_MACRO(SIGKILL);
#endif
#ifdef SIGBUS
    ADD_INT_MACRO(SIGBUS);
#endif
#ifdef SIGSEGV
    ADD_INT_MACRO(SIGSEGV);
#endif
#ifdef SIGSYS
    ADD_INT_MACRO(SIGSYS);
#endif
#ifdef SIGPIPE
    ADD_INT_MACRO(SIGPIPE);
#endif
#ifdef SIGALRM
    ADD_INT_MACRO(SIGALRM);
#endif
#ifdef SIGTERM
    ADD_INT_MACRO(SIGTERM);
#endif
#ifdef SIGUSR1
    ADD_INT_MACRO(SIGUSR1);
#endif
#ifdef SIGUSR2
    ADD_INT_MACRO(SIGUSR2);
#endif
#ifdef SIGCLD
    ADD_INT_MACRO(SIGCLD);
#endif
#ifdef SIGCHLD
    ADD_INT_MACRO(SIGCHLD);
#endif
#ifdef SIGPWR
    ADD_INT_MACRO(SIGPWR);
#endif
#ifdef SIGIO
    ADD_INT_MACRO(SIGIO);
#endif
#ifdef SIGURG
    ADD_INT_MACRO(SIGURG);
#endif
#ifdef SIGWINCH
    ADD_INT_MACRO(SIGWINCH);
#endif
#ifdef SIGPOLL
    ADD_INT_MACRO(SIGPOLL);
#endif
#ifdef SIGSTOP
    ADD_INT_MACRO(SIGSTOP);
#endif
#ifdef SIGTSTP
    ADD_INT_MACRO(SIGTSTP);
#endif
#ifdef SIGCONT
    ADD_INT_MACRO(SIGCONT);
#endif
#ifdef SIGTTIN
    ADD_INT_MACRO(SIGTTIN);
#endif
#ifdef SIGTTOU
    ADD_INT_MACRO(SIGTTOU);
#endif
#ifdef SIGVTALRM
    ADD_INT_MACRO(SIGVTALRM);
#endif
#ifdef SIGPROF
    ADD_INT_MACRO(SIGPROF);
#endif
#ifdef SIGXCPU
    ADD_INT_MACRO(SIGXCPU);
#endif
#ifdef SIGXFSZ
    ADD_INT_MACRO(SIGXFSZ);
#endif
#ifdef SIGRTMIN
    ADD_INT_MACRO(SIGRTMIN);
#endif
#ifdef SIGRTMAX
    ADD_INT_MACRO(SIGRTMAX);
#endif
#ifdef SIGINFO
    ADD_INT_MACRO(SIGINFO);
#endif
#ifdef SIGSTKFLT
    ADD_INT_MACRO(SIGSTKFLT);
#endif

    // ITIMER_xxx constants
#ifdef ITIMER_REAL
    ADD_INT_MACRO(ITIMER_REAL);
#endif
#ifdef ITIMER_VIRTUAL
    ADD_INT_MACRO(ITIMER_VIRTUAL);
#endif
#ifdef ITIMER_PROF
    ADD_INT_MACRO(ITIMER_PROF);
#endif

    // CTRL_xxx Windows signals
#ifdef CTRL_C_EVENT
    ADD_INT_MACRO(CTRL_C_EVENT);
#endif
#ifdef CTRL_BREAK_EVENT
    ADD_INT_MACRO(CTRL_BREAK_EVENT);
#endif

    return 0;

#undef ADD_INT_MACRO
}


static int
signal_get_set_handlers(signal_state_t *state, PyObject *mod_dict)
{
    // Get signal handlers
    for (int signum = 1; signum < Py_NSIG; signum++) {
        void (*c_handler)(int) = PyOS_getsig(signum);
        PyObject *func;
        if (c_handler == SIG_DFL) {
            func = state->default_handler;
        }
        else if (c_handler == SIG_IGN) {
            func = state->ignore_handler;
        }
        else {
            func = Py_None; // None of our business
        }
        // If signal_module_exec() is called more than one, we must
        // clear the strong reference to the previous function.
        PyObject* old_func = get_handler(signum);
        set_handler(signum, Py_NewRef(func));
        Py_XDECREF(old_func);
    }

    // Install Python SIGINT handler which raises KeyboardInterrupt
    PyObject* sigint_func = get_handler(SIGINT);
    if (sigint_func == state->default_handler) {
        PyObject *int_handler = PyMapping_GetItemString(mod_dict,
                                                        "default_int_handler");
        if (!int_handler) {
            return -1;
        }

        set_handler(SIGINT, int_handler);
        Py_DECREF(sigint_func);
        PyOS_setsig(SIGINT, signal_handler);
    }
    return 0;
}


static int
signal_module_exec(PyObject *m)
{
    assert(!PyErr_Occurred());

    signal_state_t *state = &signal_global_state;
    _signal_module_state *modstate = get_signal_state(m);

    // XXX For proper isolation, these values must be guaranteed
    // to be effectively const (e.g. immortal).
    modstate->default_handler = state->default_handler;  // borrowed ref
    modstate->ignore_handler = state->ignore_handler;  // borrowed ref

#ifdef PYHAVE_ITIMER_ERROR
    modstate->itimer_error = PyErr_NewException("signal.itimer_error",
                                                PyExc_OSError, NULL);
    if (modstate->itimer_error == NULL) {
        return -1;
    }
#endif

    if (signal_add_constants(m) < 0) {
        return -1;
    }

    /* Add some symbolic constants to the module */
    PyObject *d = PyModule_GetDict(m);
    if (PyDict_SetItemString(d, "SIG_DFL", state->default_handler) < 0) {
        return -1;
    }
    if (PyDict_SetItemString(d, "SIG_IGN", state->ignore_handler) < 0) {
        return -1;
    }
#ifdef PYHAVE_ITIMER_ERROR
    if (PyDict_SetItemString(d, "ItimerError", modstate->itimer_error) < 0) {
        return -1;
    }
#endif

#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
    modstate->siginfo_type = PyStructSequence_NewType(&struct_siginfo_desc);
    if (modstate->siginfo_type == NULL) {
        return -1;
    }
#endif
#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
    if (PyModule_AddType(m, modstate->siginfo_type) < 0) {
        return -1;
    }
#endif

    PyThreadState *tstate = _PyThreadState_GET();
    if (_Py_IsMainInterpreter(tstate->interp)) {
        if (signal_get_set_handlers(state, d) < 0) {
            return -1;
        }
    }

    assert(!PyErr_Occurred());
    return 0;
}


#ifdef PYHAVE_ITIMER_ERROR
static int
_signal_module_traverse(PyObject *module, visitproc visit, void *arg)
{
    _signal_module_state *state = get_signal_state(module);
    Py_VISIT(state->itimer_error);
    Py_VISIT(state->siginfo_type);
    return 0;
}

static int
_signal_module_clear(PyObject *module)
{
    _signal_module_state *state = get_signal_state(module);
    Py_CLEAR(state->itimer_error);
    Py_CLEAR(state->siginfo_type);
    return 0;
}

static void
_signal_module_free(void *module)
{
    _signal_module_clear((PyObject *)module);
}
#endif  // PYHAVE_ITIMER_ERROR


static PyModuleDef_Slot signal_slots[] = {
    {Py_mod_exec, signal_module_exec},
    {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
    {0, NULL}
};

static struct PyModuleDef signal_module = {
    PyModuleDef_HEAD_INIT,
    "_signal",
    .m_doc = module_doc,
    .m_size = sizeof(_signal_module_state),
    .m_methods = signal_methods,
    .m_slots = signal_slots,
#ifdef PYHAVE_ITIMER_ERROR
    .m_traverse = _signal_module_traverse,
    .m_clear = _signal_module_clear,
    .m_free = _signal_module_free,
#endif
};


PyMODINIT_FUNC
PyInit__signal(void)
{
    return PyModuleDef_Init(&signal_module);
}


void
_PySignal_Fini(void)
{
    signal_state_t *state = &signal_global_state;

    // Restore default signals and clear handlers
    for (int signum = 1; signum < Py_NSIG; signum++) {
        PyObject *func = get_handler(signum);
        _Py_atomic_store_relaxed(&Handlers[signum].tripped, 0);
        set_handler(signum, NULL);
        if (func != NULL
            && func != Py_None
            && !compare_handler(func, state->default_handler)
            && !compare_handler(func, state->ignore_handler))
        {
            PyOS_setsig(signum, SIG_DFL);
        }
        Py_XDECREF(func);
    }

#ifdef MS_WINDOWS
    if (state->sigint_event != NULL) {
        CloseHandle((HANDLE)state->sigint_event);
        state->sigint_event = NULL;
    }
#endif

    Py_CLEAR(state->default_handler);
    Py_CLEAR(state->ignore_handler);
}


/* Declared in pyerrors.h */
int
PyErr_CheckSignals(void)
{
    PyThreadState *tstate = _PyThreadState_GET();

    /* Opportunistically check if the GC is scheduled to run and run it
       if we have a request. This is done here because native code needs
       to call this API if is going to run for some time without executing
       Python code to ensure signals are handled. Checking for the GC here
       allows long running native code to clean cycles created using the C-API
       even if it doesn't run the evaluation loop */
    struct _ceval_state *interp_ceval_state = &tstate->interp->ceval;
    if (_Py_atomic_load_relaxed(&interp_ceval_state->gc_scheduled)) {
        _Py_atomic_store_relaxed(&interp_ceval_state->gc_scheduled, 0);
        _Py_RunGC(tstate);
    }

    if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
        return 0;
    }

    return _PyErr_CheckSignalsTstate(tstate);
}


/* Declared in cpython/pyerrors.h */
int
_PyErr_CheckSignalsTstate(PyThreadState *tstate)
{
    _Py_CHECK_EMSCRIPTEN_SIGNALS();
    if (!_Py_atomic_load(&is_tripped)) {
        return 0;
    }

    /*
     * The is_tripped variable is meant to speed up the calls to
     * PyErr_CheckSignals (both directly or via pending calls) when no
     * signal has arrived. This variable is set to 1 when a signal arrives
     * and it is set to 0 here, when we know some signals arrived. This way
     * we can run the registered handlers with no signals blocked.
     *
     * NOTE: with this approach we can have a situation where is_tripped is
     *       1 but we have no more signals to handle (Handlers[i].tripped
     *       is 0 for every signal i). This won't do us any harm (except
     *       we're gonna spent some cycles for nothing). This happens when
     *       we receive a signal i after we zero is_tripped and before we
     *       check Handlers[i].tripped.
     */
    _Py_atomic_store(&is_tripped, 0);

    _PyInterpreterFrame *frame = _PyThreadState_GetFrame(tstate);
    signal_state_t *state = &signal_global_state;
    for (int i = 1; i < Py_NSIG; i++) {
        if (!_Py_atomic_load_relaxed(&Handlers[i].tripped)) {
            continue;
        }
        _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);

        /* Signal handlers can be modified while a signal is received,
         * and therefore the fact that trip_signal() or PyErr_SetInterrupt()
         * was called doesn't guarantee that there is still a Python
         * signal handler for it by the time PyErr_CheckSignals() is called
         * (see bpo-43406).
         */
        PyObject *func = get_handler(i);
        if (func == NULL || func == Py_None ||
            compare_handler(func, state->ignore_handler) ||
            compare_handler(func, state->default_handler)) {
            /* No Python signal handler due to aforementioned race condition.
             * We can't call raise() as it would break the assumption
             * that PyErr_SetInterrupt() only *simulates* an incoming
             * signal (i.e. it will never kill the process).
             * We also don't want to interrupt user code with a cryptic
             * asynchronous exception, so instead just write out an
             * unraisable error.
             */
            PyErr_Format(PyExc_OSError,
                         "Signal %i ignored due to race condition",
                         i);
            PyErr_WriteUnraisable(Py_None);
            continue;
        }
        PyObject *arglist = NULL;
        if (frame == NULL) {
            arglist = Py_BuildValue("(iO)", i, Py_None);
        }
        else {
            PyFrameObject *f = _PyFrame_GetFrameObject(frame);
            if (f != NULL) {
                arglist = Py_BuildValue("(iO)", i, f);
            }
        }
        PyObject *result;
        if (arglist) {
            result = _PyObject_Call(tstate, func, arglist, NULL);
            Py_DECREF(arglist);
        }
        else {
            result = NULL;
        }
        if (!result) {
            /* On error, re-schedule a call to _PyErr_CheckSignalsTstate() */
            _Py_atomic_store(&is_tripped, 1);
            return -1;
        }

        Py_DECREF(result);
    }

    return 0;
}



int
_PyErr_CheckSignals(void)
{
    PyThreadState *tstate = _PyThreadState_GET();
    return _PyErr_CheckSignalsTstate(tstate);
}


/* Simulate the effect of a signal arriving. The next time PyErr_CheckSignals
   is called,  the corresponding Python signal handler will be raised.

   Missing signal handler for the given signal number is silently ignored. */
int
PyErr_SetInterruptEx(int signum)
{
    if (signum < 1 || signum >= Py_NSIG) {
        return -1;
    }

    signal_state_t *state = &signal_global_state;
    PyObject *func = get_handler(signum);
    if (!compare_handler(func, state->ignore_handler)
            && !compare_handler(func, state->default_handler)) {
        trip_signal(signum);
    }
    return 0;
}

void
PyErr_SetInterrupt(void)
{
    (void) PyErr_SetInterruptEx(SIGINT);
}

static int
signal_install_handlers(void)
{
#ifdef SIGPIPE
    PyOS_setsig(SIGPIPE, SIG_IGN);
#endif
#ifdef SIGXFZ
    PyOS_setsig(SIGXFZ, SIG_IGN);
#endif
#ifdef SIGXFSZ
    PyOS_setsig(SIGXFSZ, SIG_IGN);
#endif

    // Import _signal to install the Python SIGINT handler
    PyObject *module = PyImport_ImportModule("_signal");
    if (!module) {
        return -1;
    }
    Py_DECREF(module);

    return 0;
}


/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
 *
 * All of the code in this function must only use async-signal-safe functions,
 * listed at `man 7 signal` or
 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
 *
 * If this function is updated, update also _posix_spawn() of subprocess.py.
 */
void
_Py_RestoreSignals(void)
{
#ifdef SIGPIPE
    PyOS_setsig(SIGPIPE, SIG_DFL);
#endif
#ifdef SIGXFZ
    PyOS_setsig(SIGXFZ, SIG_DFL);
#endif
#ifdef SIGXFSZ
    PyOS_setsig(SIGXFSZ, SIG_DFL);
#endif
}


int
_PySignal_Init(int install_signal_handlers)
{
    signal_state_t *state = &signal_global_state;

    state->default_handler = PyLong_FromVoidPtr((void *)SIG_DFL);
    if (state->default_handler == NULL) {
        return -1;
    }

    state->ignore_handler = PyLong_FromVoidPtr((void *)SIG_IGN);
    if (state->ignore_handler == NULL) {
        return -1;
    }

#ifdef MS_WINDOWS
    /* Create manual-reset event, initially unset */
    state->sigint_event = (void *)CreateEvent(NULL, TRUE, FALSE, FALSE);
    if (state->sigint_event == NULL) {
        PyErr_SetFromWindowsErr(0);
        return -1;
    }
#endif

    for (int signum = 1; signum < Py_NSIG; signum++) {
        _Py_atomic_store_relaxed(&Handlers[signum].tripped, 0);
    }

    if (install_signal_handlers) {
        if (signal_install_handlers() < 0) {
            return -1;
        }
    }

    return 0;
}


// The caller doesn't have to hold the GIL
int
_PyOS_InterruptOccurred(PyThreadState *tstate)
{
    _Py_EnsureTstateNotNULL(tstate);
    if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
        return 0;
    }

    if (!_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) {
        return 0;
    }

    _Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0);
    return 1;
}


// The caller must to hold the GIL
int
PyOS_InterruptOccurred(void)
{
    PyThreadState *tstate = _PyThreadState_GET();
    return _PyOS_InterruptOccurred(tstate);
}


#ifdef HAVE_FORK
static void
_clear_pending_signals(void)
{
    if (!_Py_atomic_load(&is_tripped)) {
        return;
    }

    _Py_atomic_store(&is_tripped, 0);
    for (int i = 1; i < Py_NSIG; ++i) {
        _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
    }
}

void
_PySignal_AfterFork(void)
{
    /* Clear the signal flags after forking so that they aren't handled
     * in both processes if they came in just before the fork() but before
     * the interpreter had an opportunity to call the handlers.  issue9535. */
    _clear_pending_signals();
}
#endif   /* HAVE_FORK */


int
_PyOS_IsMainThread(void)
{
    PyInterpreterState *interp = _PyInterpreterState_GET();
    return _Py_ThreadCanHandleSignals(interp);
}

#ifdef MS_WINDOWS
/* Returns a manual-reset event which gets tripped whenever
   SIGINT is received.

   Python.h does not include windows.h so we do cannot use HANDLE
   as the return type of this function.  We use void* instead. */
void *_PyOS_SigintEvent(void)
{
    signal_state_t *state = &signal_global_state;
    return state->sigint_event;
}
#endif
