mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
bpo-1635741: Port resource extension module to multiphase initialization (PEP 489) (GH-19252)
Fix also reference leaks on error.
This commit is contained in:
parent
8ec7cb53f0
commit
45f7008a66
2 changed files with 73 additions and 53 deletions
|
@ -0,0 +1 @@
|
||||||
|
Port :mod:`resource` to multiphase initialization (:pep:`489`).
|
|
@ -340,155 +340,174 @@ resource_methods[] = {
|
||||||
/* Module initialization */
|
/* Module initialization */
|
||||||
|
|
||||||
|
|
||||||
static struct PyModuleDef resourcemodule = {
|
static int
|
||||||
PyModuleDef_HEAD_INIT,
|
resource_exec(PyObject *module)
|
||||||
"resource",
|
|
||||||
NULL,
|
|
||||||
-1,
|
|
||||||
resource_methods,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
PyMODINIT_FUNC
|
|
||||||
PyInit_resource(void)
|
|
||||||
{
|
{
|
||||||
PyObject *m, *v;
|
#define ADD_INT(module, value) \
|
||||||
|
do { \
|
||||||
/* Create the module and add the functions */
|
if (PyModule_AddIntConstant(module, #value, value) < 0) { \
|
||||||
m = PyModule_Create(&resourcemodule);
|
return -1; \
|
||||||
if (m == NULL)
|
} \
|
||||||
return NULL;
|
} while (0)
|
||||||
|
|
||||||
/* Add some symbolic constants to the module */
|
/* Add some symbolic constants to the module */
|
||||||
Py_INCREF(PyExc_OSError);
|
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 (!initialized) {
|
||||||
if (PyStructSequence_InitType2(&StructRUsageType,
|
if (PyStructSequence_InitType2(&StructRUsageType,
|
||||||
&struct_rusage_desc) < 0)
|
&struct_rusage_desc) < 0)
|
||||||
return NULL;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_INCREF(&StructRUsageType);
|
if(PyModule_AddType(module, &StructRUsageType) < 0) {
|
||||||
PyModule_AddObject(m, "struct_rusage",
|
return -1;
|
||||||
(PyObject*) &StructRUsageType);
|
}
|
||||||
|
|
||||||
/* insert constants */
|
/* insert constants */
|
||||||
#ifdef RLIMIT_CPU
|
#ifdef RLIMIT_CPU
|
||||||
PyModule_AddIntMacro(m, RLIMIT_CPU);
|
ADD_INT(module, RLIMIT_CPU);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_FSIZE
|
#ifdef RLIMIT_FSIZE
|
||||||
PyModule_AddIntMacro(m, RLIMIT_FSIZE);
|
ADD_INT(module, RLIMIT_FSIZE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_DATA
|
#ifdef RLIMIT_DATA
|
||||||
PyModule_AddIntMacro(m, RLIMIT_DATA);
|
ADD_INT(module, RLIMIT_DATA);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_STACK
|
#ifdef RLIMIT_STACK
|
||||||
PyModule_AddIntMacro(m, RLIMIT_STACK);
|
ADD_INT(module, RLIMIT_STACK);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_CORE
|
#ifdef RLIMIT_CORE
|
||||||
PyModule_AddIntMacro(m, RLIMIT_CORE);
|
ADD_INT(module, RLIMIT_CORE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_NOFILE
|
#ifdef RLIMIT_NOFILE
|
||||||
PyModule_AddIntMacro(m, RLIMIT_NOFILE);
|
ADD_INT(module, RLIMIT_NOFILE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_OFILE
|
#ifdef RLIMIT_OFILE
|
||||||
PyModule_AddIntMacro(m, RLIMIT_OFILE);
|
ADD_INT(module, RLIMIT_OFILE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_VMEM
|
#ifdef RLIMIT_VMEM
|
||||||
PyModule_AddIntMacro(m, RLIMIT_VMEM);
|
ADD_INT(module, RLIMIT_VMEM);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_AS
|
#ifdef RLIMIT_AS
|
||||||
PyModule_AddIntMacro(m, RLIMIT_AS);
|
ADD_INT(module, RLIMIT_AS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_RSS
|
#ifdef RLIMIT_RSS
|
||||||
PyModule_AddIntMacro(m, RLIMIT_RSS);
|
ADD_INT(module, RLIMIT_RSS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_NPROC
|
#ifdef RLIMIT_NPROC
|
||||||
PyModule_AddIntMacro(m, RLIMIT_NPROC);
|
ADD_INT(module, RLIMIT_NPROC);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_MEMLOCK
|
#ifdef RLIMIT_MEMLOCK
|
||||||
PyModule_AddIntMacro(m, RLIMIT_MEMLOCK);
|
ADD_INT(module, RLIMIT_MEMLOCK);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_SBSIZE
|
#ifdef RLIMIT_SBSIZE
|
||||||
PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
|
ADD_INT(module, RLIMIT_SBSIZE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Linux specific */
|
/* Linux specific */
|
||||||
#ifdef RLIMIT_MSGQUEUE
|
#ifdef RLIMIT_MSGQUEUE
|
||||||
PyModule_AddIntMacro(m, RLIMIT_MSGQUEUE);
|
ADD_INT(module, RLIMIT_MSGQUEUE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_NICE
|
#ifdef RLIMIT_NICE
|
||||||
PyModule_AddIntMacro(m, RLIMIT_NICE);
|
ADD_INT(module, RLIMIT_NICE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_RTPRIO
|
#ifdef RLIMIT_RTPRIO
|
||||||
PyModule_AddIntMacro(m, RLIMIT_RTPRIO);
|
ADD_INT(module, RLIMIT_RTPRIO);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_RTTIME
|
#ifdef RLIMIT_RTTIME
|
||||||
PyModule_AddIntMacro(m, RLIMIT_RTTIME);
|
ADD_INT(module, RLIMIT_RTTIME);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_SIGPENDING
|
#ifdef RLIMIT_SIGPENDING
|
||||||
PyModule_AddIntMacro(m, RLIMIT_SIGPENDING);
|
ADD_INT(module, RLIMIT_SIGPENDING);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* target */
|
/* target */
|
||||||
#ifdef RUSAGE_SELF
|
#ifdef RUSAGE_SELF
|
||||||
PyModule_AddIntMacro(m, RUSAGE_SELF);
|
ADD_INT(module, RUSAGE_SELF);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RUSAGE_CHILDREN
|
#ifdef RUSAGE_CHILDREN
|
||||||
PyModule_AddIntMacro(m, RUSAGE_CHILDREN);
|
ADD_INT(module, RUSAGE_CHILDREN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RUSAGE_BOTH
|
#ifdef RUSAGE_BOTH
|
||||||
PyModule_AddIntMacro(m, RUSAGE_BOTH);
|
ADD_INT(module, RUSAGE_BOTH);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RUSAGE_THREAD
|
#ifdef RUSAGE_THREAD
|
||||||
PyModule_AddIntMacro(m, RUSAGE_THREAD);
|
ADD_INT(module, RUSAGE_THREAD);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* FreeBSD specific */
|
/* FreeBSD specific */
|
||||||
|
|
||||||
#ifdef RLIMIT_SWAP
|
#ifdef RLIMIT_SWAP
|
||||||
PyModule_AddIntMacro(m, RLIMIT_SWAP);
|
ADD_INT(module, RLIMIT_SWAP);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_SBSIZE
|
#ifdef RLIMIT_SBSIZE
|
||||||
PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
|
ADD_INT(module, RLIMIT_SBSIZE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RLIMIT_NPTS
|
#ifdef RLIMIT_NPTS
|
||||||
PyModule_AddIntMacro(m, RLIMIT_NPTS);
|
ADD_INT(module, RLIMIT_NPTS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
PyObject *v;
|
||||||
if (sizeof(RLIM_INFINITY) > sizeof(long)) {
|
if (sizeof(RLIM_INFINITY) > sizeof(long)) {
|
||||||
v = PyLong_FromLongLong((long long) RLIM_INFINITY);
|
v = PyLong_FromLongLong((long long) RLIM_INFINITY);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
v = PyLong_FromLong((long) RLIM_INFINITY);
|
v = PyLong_FromLong((long) RLIM_INFINITY);
|
||||||
}
|
}
|
||||||
if (v) {
|
if (!v) {
|
||||||
PyModule_AddObject(m, "RLIM_INFINITY", v);
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PyModule_AddObject(module, "RLIM_INFINITY", v) < 0) {
|
||||||
|
Py_DECREF(v);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
initialized = 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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue