[3.9] bpo-41498: Fix build on platforms without sigset_t (GH-29770) (GH-29774)
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
https://github.com/python/cpython/commit/71b414750eee7af98cc3cee3a64c59d4830... commit: 71b414750eee7af98cc3cee3a64c59d48302a17a branch: 3.9 author: Christian Heimes <christian@python.org> committer: tiran <christian@python.org> date: 2021-11-25T13:02:54+01:00 summary: [3.9] bpo-41498: Fix build on platforms without sigset_t (GH-29770) (GH-29774) Co-authored-by: Christian Heimes <christian@python.org> files: A Misc/NEWS.d/next/Build/2021-11-25-09-15-04.bpo-41498.qAk5eo.rst M Modules/clinic/signalmodule.c.h M Modules/posixmodule.c M Modules/posixmodule.h M Modules/signalmodule.c diff --git a/Misc/NEWS.d/next/Build/2021-11-25-09-15-04.bpo-41498.qAk5eo.rst b/Misc/NEWS.d/next/Build/2021-11-25-09-15-04.bpo-41498.qAk5eo.rst new file mode 100644 index 0000000000000..18dc290dafd02 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-11-25-09-15-04.bpo-41498.qAk5eo.rst @@ -0,0 +1,4 @@ +Python now compiles on platforms without ``sigset_t``. Several functions +in :mod:`signal` are not available when ``sigset_t`` is missing. + +Based on patch by Roman Yurchak for pyodide. diff --git a/Modules/clinic/signalmodule.c.h b/Modules/clinic/signalmodule.c.h index 7f60e28a3a28a..0fb25d5640bba 100644 --- a/Modules/clinic/signalmodule.c.h +++ b/Modules/clinic/signalmodule.c.h @@ -363,7 +363,7 @@ signal_getitimer(PyObject *module, PyObject *arg) #endif /* defined(HAVE_GETITIMER) */ -#if defined(PYPTHREAD_SIGMASK) +#if defined(HAVE_SIGSET_T) && defined(PYPTHREAD_SIGMASK) PyDoc_STRVAR(signal_pthread_sigmask__doc__, "pthread_sigmask($module, how, mask, /)\n" @@ -405,9 +405,9 @@ signal_pthread_sigmask(PyObject *module, PyObject *const *args, Py_ssize_t nargs return return_value; } -#endif /* defined(PYPTHREAD_SIGMASK) */ +#endif /* defined(HAVE_SIGSET_T) && defined(PYPTHREAD_SIGMASK) */ -#if defined(HAVE_SIGPENDING) +#if defined(HAVE_SIGSET_T) && defined(HAVE_SIGPENDING) PyDoc_STRVAR(signal_sigpending__doc__, "sigpending($module, /)\n" @@ -430,9 +430,9 @@ signal_sigpending(PyObject *module, PyObject *Py_UNUSED(ignored)) return signal_sigpending_impl(module); } -#endif /* defined(HAVE_SIGPENDING) */ +#endif /* defined(HAVE_SIGSET_T) && defined(HAVE_SIGPENDING) */ -#if defined(HAVE_SIGWAIT) +#if defined(HAVE_SIGSET_T) && defined(HAVE_SIGWAIT) PyDoc_STRVAR(signal_sigwait__doc__, "sigwait($module, sigset, /)\n" @@ -465,9 +465,9 @@ signal_sigwait(PyObject *module, PyObject *arg) return return_value; } -#endif /* defined(HAVE_SIGWAIT) */ +#endif /* defined(HAVE_SIGSET_T) && defined(HAVE_SIGWAIT) */ -#if (defined(HAVE_SIGFILLSET) || defined(MS_WINDOWS)) +#if ((defined(HAVE_SIGFILLSET) && defined(HAVE_SIGSET_T)) || defined(MS_WINDOWS)) PyDoc_STRVAR(signal_valid_signals__doc__, "valid_signals($module, /)\n" @@ -490,9 +490,9 @@ signal_valid_signals(PyObject *module, PyObject *Py_UNUSED(ignored)) return signal_valid_signals_impl(module); } -#endif /* (defined(HAVE_SIGFILLSET) || defined(MS_WINDOWS)) */ +#endif /* ((defined(HAVE_SIGFILLSET) && defined(HAVE_SIGSET_T)) || defined(MS_WINDOWS)) */ -#if defined(HAVE_SIGWAITINFO) +#if defined(HAVE_SIGSET_T) && defined(HAVE_SIGWAITINFO) PyDoc_STRVAR(signal_sigwaitinfo__doc__, "sigwaitinfo($module, sigset, /)\n" @@ -523,9 +523,9 @@ signal_sigwaitinfo(PyObject *module, PyObject *arg) return return_value; } -#endif /* defined(HAVE_SIGWAITINFO) */ +#endif /* defined(HAVE_SIGSET_T) && defined(HAVE_SIGWAITINFO) */ -#if defined(HAVE_SIGTIMEDWAIT) +#if defined(HAVE_SIGSET_T) && defined(HAVE_SIGTIMEDWAIT) PyDoc_STRVAR(signal_sigtimedwait__doc__, "sigtimedwait($module, sigset, timeout, /)\n" @@ -562,7 +562,7 @@ signal_sigtimedwait(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -#endif /* defined(HAVE_SIGTIMEDWAIT) */ +#endif /* defined(HAVE_SIGSET_T) && defined(HAVE_SIGTIMEDWAIT) */ #if defined(HAVE_PTHREAD_KILL) @@ -732,4 +732,4 @@ signal_pidfd_send_signal(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF #define SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF #endif /* !defined(SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF) */ -/*[clinic end generated code: output=b41b4b6bd9ad4da2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3c8b80f14df17563 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index f2dcf965db760..29d61268e1b5d 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5882,6 +5882,7 @@ parse_posix_spawn_flags(PyObject *module, const char *func_name, PyObject *setpg } +#ifdef HAVE_SIGSET_T if (setsigmask) { sigset_t set; if (!_Py_Sigset_Converter(setsigmask, &set)) { @@ -5907,6 +5908,13 @@ parse_posix_spawn_flags(PyObject *module, const char *func_name, PyObject *setpg } all_flags |= POSIX_SPAWN_SETSIGDEF; } +#else + if (setsigmask || setsigdef) { + PyErr_SetString(PyExc_NotImplementedError, + "sigset is not supported on this platform"); + goto fail; + } +#endif if (scheduler) { #ifdef POSIX_SPAWN_SETSCHEDULER diff --git a/Modules/posixmodule.h b/Modules/posixmodule.h index 711ac686934b0..5452ffbf17acf 100644 --- a/Modules/posixmodule.h +++ b/Modules/posixmodule.h @@ -23,9 +23,7 @@ PyAPI_FUNC(int) _Py_Gid_Converter(PyObject *, gid_t *); # define HAVE_SIGSET_T #endif -#ifdef HAVE_SIGSET_T PyAPI_FUNC(int) _Py_Sigset_Converter(PyObject *, void *); -#endif /* HAVE_SIGSET_T */ #endif /* Py_LIMITED_API */ #ifdef __cplusplus diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index de564c2db8353..e396a4ad8b44b 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -68,6 +68,8 @@ 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): @@ -76,6 +78,7 @@ class sigset_t_converter(CConverter): [python start generated code]*/ /*[python end generated code: output=da39a3ee5e6b4b0d input=b5689d14466b6823]*/ +#endif /* NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS @@ -880,6 +883,7 @@ signal_getitimer_impl(PyObject *module, int which) #endif +#ifdef HAVE_SIGSET_T #if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING) static PyObject* sigset_to_set(sigset_t mask) @@ -1011,9 +1015,9 @@ signal_sigwait_impl(PyObject *module, sigset_t sigset) } #endif /* #ifdef HAVE_SIGWAIT */ +#endif /* #ifdef HAVE_SIGSET_T */ - -#if defined(HAVE_SIGFILLSET) || defined(MS_WINDOWS) +#if (defined(HAVE_SIGFILLSET) && defined(HAVE_SIGSET_T)) || defined(MS_WINDOWS) /*[clinic input] signal.valid_signals @@ -1051,7 +1055,8 @@ signal_valid_signals_impl(PyObject *module) #endif } -#endif /* #if defined(HAVE_SIGFILLSET) || defined(MS_WINDOWS) */ +#endif /* #if (defined(HAVE_SIGFILLSET) && defined(HAVE_SIGSET_T)) || defined(MS_WINDOWS) */ + #if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT) @@ -1117,6 +1122,7 @@ fill_siginfo(siginfo_t *si) } #endif +#ifdef HAVE_SIGSET_T #ifdef HAVE_SIGWAITINFO /*[clinic input] @@ -1219,6 +1225,7 @@ signal_sigtimedwait_impl(PyObject *module, sigset_t sigset, } #endif /* #ifdef HAVE_SIGTIMEDWAIT */ +#endif /* #ifdef HAVE_SIGSET_T */ #if defined(HAVE_PTHREAD_KILL)
participants (1)
-
tiran