[Python-checkins] bpo-46417: signal uses PyStructSequence_NewType() (GH-30735)

vstinner webhook-mailer at python.org
Thu Jan 20 22:02:49 EST 2022


https://github.com/python/cpython/commit/d013b241352e902389f955f8f99d75f16c124ee2
commit: d013b241352e902389f955f8f99d75f16c124ee2
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2022-01-21T04:02:38+01:00
summary:

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.

files:
M Modules/signalmodule.c

diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index e6f56e0aea9a9..423dc1687bf24 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
 



More information about the Python-checkins mailing list