summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2022-01-21 03:02:38 (GMT)
committerGitHub <noreply@github.com>2022-01-21 03:02:38 (GMT)
commitd013b241352e902389f955f8f99d75f16c124ee2 (patch)
tree669f683a125a254191afd8c32f8d10784536ae6c /Modules
parent1781d55eb34f94029e50970232635fc5082378cb (diff)
downloadcpython-d013b241352e902389f955f8f99d75f16c124ee2.zip
cpython-d013b241352e902389f955f8f99d75f16c124ee2.tar.gz
cpython-d013b241352e902389f955f8f99d75f16c124ee2.tar.bz2
bpo-46417: signal uses PyStructSequence_NewType() (GH-30735)
The signal module now creates its struct_siginfo type as a heap type using PyStructSequence_NewType(), rather than using a static type. Add 'siginfo_type' member to the global signal_state_t structure.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/signalmodule.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index e6f56e0..423dc16 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -136,6 +136,7 @@ typedef struct {
#ifdef MS_WINDOWS
HANDLE sigint_event;
#endif
+ PyTypeObject *siginfo_type;
} signal_state_t;
// State shared by all Python interpreters
@@ -1136,12 +1137,13 @@ static PyStructSequence_Desc struct_siginfo_desc = {
7 /* n_in_sequence */
};
-static PyTypeObject SiginfoType;
static PyObject *
fill_siginfo(siginfo_t *si)
{
- PyObject *result = PyStructSequence_New(&SiginfoType);
+ signal_state_t *state = &signal_global_state;
+
+ PyObject *result = PyStructSequence_New(state->siginfo_type);
if (!result)
return NULL;
@@ -1660,7 +1662,7 @@ signal_module_exec(PyObject *m)
}
#endif
#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
- if (PyModule_AddType(m, &SiginfoType) < 0) {
+ if (PyModule_AddType(m, state->siginfo_type) < 0) {
return -1;
}
#endif
@@ -1758,6 +1760,7 @@ _PySignal_Fini(void)
Py_CLEAR(state->default_handler);
Py_CLEAR(state->ignore_handler);
+ Py_CLEAR(state->siginfo_type);
}
@@ -1966,10 +1969,9 @@ _PySignal_Init(int install_signal_handlers)
#endif
#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
- if (SiginfoType.tp_name == NULL) {
- if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0) {
- return -1;
- }
+ state->siginfo_type = PyStructSequence_NewType(&struct_siginfo_desc);
+ if (state->siginfo_type == NULL) {
+ return -1;
}
#endif