]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-1635741: Port resource extension module to multiphase initialization (PEP 489...
authorHai Shi <shihai1992@gmail.com>
Thu, 2 Apr 2020 12:35:08 +0000 (20:35 +0800)
committerGitHub <noreply@github.com>
Thu, 2 Apr 2020 12:35:08 +0000 (14:35 +0200)
Fix also reference leaks on error.

Misc/NEWS.d/next/Core and Builtins/2020-04-01-00-08-18.bpo-1635741.bhGWam.rst [new file with mode: 0644]
Modules/resource.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-04-01-00-08-18.bpo-1635741.bhGWam.rst b/Misc/NEWS.d/next/Core and Builtins/2020-04-01-00-08-18.bpo-1635741.bhGWam.rst
new file mode 100644 (file)
index 0000000..cacfed2
--- /dev/null
@@ -0,0 +1 @@
+Port :mod:`resource` to multiphase initialization (:pep:`489`).
index afde03c6c7e55983ff3f8fa615e8d840a453de2b..ddbf80be9c69eb0c51802049a82de87d74246bc5 100644 (file)
@@ -340,155 +340,174 @@ resource_methods[] = {
 /* Module initialization */
 
 
-static struct PyModuleDef resourcemodule = {
-    PyModuleDef_HEAD_INIT,
-    "resource",
-    NULL,
-    -1,
-    resource_methods,
-    NULL,
-    NULL,
-    NULL,
-    NULL
-};
-
-PyMODINIT_FUNC
-PyInit_resource(void)
+static int
+resource_exec(PyObject *module)
 {
-    PyObject *m, *v;
-
-    /* Create the module and add the functions */
-    m = PyModule_Create(&resourcemodule);
-    if (m == NULL)
-        return NULL;
+#define ADD_INT(module, value)                                    \
+    do {                                                          \
+        if (PyModule_AddIntConstant(module, #value, value) < 0) { \
+            return -1;                                            \
+        }                                                         \
+    } while (0)
 
     /* Add some symbolic constants to the module */
     Py_INCREF(PyExc_OSError);
-    PyModule_AddObject(m, "error", PyExc_OSError);
+    if (PyModule_AddObject(module, "error", PyExc_OSError) < 0) {
+        Py_DECREF(PyExc_OSError);
+        return -1;
+    }
     if (!initialized) {
         if (PyStructSequence_InitType2(&StructRUsageType,
                                        &struct_rusage_desc) < 0)
-            return NULL;
+            return -1;
     }
 
-    Py_INCREF(&StructRUsageType);
-    PyModule_AddObject(m, "struct_rusage",
-                       (PyObject*) &StructRUsageType);
+    if(PyModule_AddType(module, &StructRUsageType) < 0) {
+        return -1;
+    }
 
     /* insert constants */
 #ifdef RLIMIT_CPU
-    PyModule_AddIntMacro(m, RLIMIT_CPU);
+    ADD_INT(module, RLIMIT_CPU);
 #endif
 
 #ifdef RLIMIT_FSIZE
-    PyModule_AddIntMacro(m, RLIMIT_FSIZE);
+    ADD_INT(module, RLIMIT_FSIZE);
 #endif
 
 #ifdef RLIMIT_DATA
-    PyModule_AddIntMacro(m, RLIMIT_DATA);
+    ADD_INT(module, RLIMIT_DATA);
 #endif
 
 #ifdef RLIMIT_STACK
-    PyModule_AddIntMacro(m, RLIMIT_STACK);
+    ADD_INT(module, RLIMIT_STACK);
 #endif
 
 #ifdef RLIMIT_CORE
-    PyModule_AddIntMacro(m, RLIMIT_CORE);
+    ADD_INT(module, RLIMIT_CORE);
 #endif
 
 #ifdef RLIMIT_NOFILE
-    PyModule_AddIntMacro(m, RLIMIT_NOFILE);
+    ADD_INT(module, RLIMIT_NOFILE);
 #endif
 
 #ifdef RLIMIT_OFILE
-    PyModule_AddIntMacro(m, RLIMIT_OFILE);
+    ADD_INT(module, RLIMIT_OFILE);
 #endif
 
 #ifdef RLIMIT_VMEM
-    PyModule_AddIntMacro(m, RLIMIT_VMEM);
+    ADD_INT(module, RLIMIT_VMEM);
 #endif
 
 #ifdef RLIMIT_AS
-    PyModule_AddIntMacro(m, RLIMIT_AS);
+    ADD_INT(module, RLIMIT_AS);
 #endif
 
 #ifdef RLIMIT_RSS
-    PyModule_AddIntMacro(m, RLIMIT_RSS);
+    ADD_INT(module, RLIMIT_RSS);
 #endif
 
 #ifdef RLIMIT_NPROC
-    PyModule_AddIntMacro(m, RLIMIT_NPROC);
+    ADD_INT(module, RLIMIT_NPROC);
 #endif
 
 #ifdef RLIMIT_MEMLOCK
-    PyModule_AddIntMacro(m, RLIMIT_MEMLOCK);
+    ADD_INT(module, RLIMIT_MEMLOCK);
 #endif
 
 #ifdef RLIMIT_SBSIZE
-    PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
+    ADD_INT(module, RLIMIT_SBSIZE);
 #endif
 
 /* Linux specific */
 #ifdef RLIMIT_MSGQUEUE
-    PyModule_AddIntMacro(m, RLIMIT_MSGQUEUE);
+    ADD_INT(module, RLIMIT_MSGQUEUE);
 #endif
 
 #ifdef RLIMIT_NICE
-    PyModule_AddIntMacro(m, RLIMIT_NICE);
+    ADD_INT(module, RLIMIT_NICE);
 #endif
 
 #ifdef RLIMIT_RTPRIO
-    PyModule_AddIntMacro(m, RLIMIT_RTPRIO);
+    ADD_INT(module, RLIMIT_RTPRIO);
 #endif
 
 #ifdef RLIMIT_RTTIME
-    PyModule_AddIntMacro(m, RLIMIT_RTTIME);
+    ADD_INT(module, RLIMIT_RTTIME);
 #endif
 
 #ifdef RLIMIT_SIGPENDING
-    PyModule_AddIntMacro(m, RLIMIT_SIGPENDING);
+    ADD_INT(module, RLIMIT_SIGPENDING);
 #endif
 
 /* target */
 #ifdef RUSAGE_SELF
-    PyModule_AddIntMacro(m, RUSAGE_SELF);
+    ADD_INT(module, RUSAGE_SELF);
 #endif
 
 #ifdef RUSAGE_CHILDREN
-    PyModule_AddIntMacro(m, RUSAGE_CHILDREN);
+    ADD_INT(module, RUSAGE_CHILDREN);
 #endif
 
 #ifdef RUSAGE_BOTH
-    PyModule_AddIntMacro(m, RUSAGE_BOTH);
+    ADD_INT(module, RUSAGE_BOTH);
 #endif
 
 #ifdef RUSAGE_THREAD
-    PyModule_AddIntMacro(m, RUSAGE_THREAD);
+    ADD_INT(module, RUSAGE_THREAD);
 #endif
 
 /* FreeBSD specific */
 
 #ifdef RLIMIT_SWAP
-    PyModule_AddIntMacro(m, RLIMIT_SWAP);
+    ADD_INT(module, RLIMIT_SWAP);
 #endif
 
 #ifdef RLIMIT_SBSIZE
-    PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
+    ADD_INT(module, RLIMIT_SBSIZE);
 #endif
 
 #ifdef RLIMIT_NPTS
-    PyModule_AddIntMacro(m, RLIMIT_NPTS);
+    ADD_INT(module, RLIMIT_NPTS);
 #endif
 
+    PyObject *v;
     if (sizeof(RLIM_INFINITY) > sizeof(long)) {
         v = PyLong_FromLongLong((long long) RLIM_INFINITY);
     } else
     {
         v = PyLong_FromLong((long) RLIM_INFINITY);
     }
-    if (v) {
-        PyModule_AddObject(m, "RLIM_INFINITY", v);
+    if (!v) {
+        return -1;
+    }
+
+    if (PyModule_AddObject(module, "RLIM_INFINITY", v) < 0) {
+        Py_DECREF(v);
+        return -1;
     }
+
     initialized = 1;
-    return m;
+    return 0;
+
+#undef ADD_INT
+}
+
+static struct PyModuleDef_Slot resource_slots[] = {
+    {Py_mod_exec, resource_exec},
+    {0, NULL}
+};
+
+static struct PyModuleDef resourcemodule = {
+    PyModuleDef_HEAD_INIT,
+    .m_name = "resource",
+    .m_size = 0,
+    .m_methods = resource_methods,
+    .m_slots = resource_slots,
+};
+
+PyMODINIT_FUNC
+PyInit_resource(void)
+{
+    return PyModuleDef_Init(&resourcemodule);
 }