Mailing List Archive

[3.9] bpo-41498: Fix build on platforms without sigset_t (GH-29770) (GH-29774)
https://github.com/python/cpython/commit/71b414750eee7af98cc3cee3a64c59d48302a17a
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)

_______________________________________________
Python-checkins mailing list
Python-checkins@python.org
https://mail.python.org/mailman/listinfo/python-checkins