bpo-1635741: Port resource extension module to multiphase initializat… · python/cpython@45f7008
@@ -340,155 +340,174 @@ resource_methods[] = {
340340/* Module initialization */
341341342342343-static struct PyModuleDef resourcemodule = {
344-PyModuleDef_HEAD_INIT,
345-"resource",
346-NULL,
347--1,
348-resource_methods,
349-NULL,
350-NULL,
351-NULL,
352-NULL
353-};
354-355-PyMODINIT_FUNC
356-PyInit_resource(void)
343+static int
344+resource_exec(PyObject *module)
357345{
358- PyObject *m, *v;
359-360-/* Create the module and add the functions */
361-m = PyModule_Create(&resourcemodule);
362-if (m == NULL)
363- return NULL;
346+#define ADD_INT(module, value) \
347+ do { \
348+ if (PyModule_AddIntConstant(module, #value, value) < 0) { \
349+ return -1; \
350+ } \
351+} while (0)
364352365353/* Add some symbolic constants to the module */
366354Py_INCREF(PyExc_OSError);
367-PyModule_AddObject(m, "error", PyExc_OSError);
355+if (PyModule_AddObject(module, "error", PyExc_OSError) < 0) {
356+Py_DECREF(PyExc_OSError);
357+return -1;
358+ }
368359if (!initialized) {
369360if (PyStructSequence_InitType2(&StructRUsageType,
370361&struct_rusage_desc) < 0)
371-return NULL;
362+return -1;
372363 }
373364374-Py_INCREF(&StructRUsageType);
375-PyModule_AddObject(m, "struct_rusage",
376- (PyObject*) &StructRUsageType);
365+if(PyModule_AddType(module, &StructRUsageType) < 0) {
366+ return -1;
367+}
377368378369/* insert constants */
379370#ifdef RLIMIT_CPU
380-PyModule_AddIntMacro(m, RLIMIT_CPU);
371+ADD_INT(module, RLIMIT_CPU);
381372#endif
382373383374#ifdef RLIMIT_FSIZE
384-PyModule_AddIntMacro(m, RLIMIT_FSIZE);
375+ADD_INT(module, RLIMIT_FSIZE);
385376#endif
386377387378#ifdef RLIMIT_DATA
388-PyModule_AddIntMacro(m, RLIMIT_DATA);
379+ADD_INT(module, RLIMIT_DATA);
389380#endif
390381391382#ifdef RLIMIT_STACK
392-PyModule_AddIntMacro(m, RLIMIT_STACK);
383+ADD_INT(module, RLIMIT_STACK);
393384#endif
394385395386#ifdef RLIMIT_CORE
396-PyModule_AddIntMacro(m, RLIMIT_CORE);
387+ADD_INT(module, RLIMIT_CORE);
397388#endif
398389399390#ifdef RLIMIT_NOFILE
400-PyModule_AddIntMacro(m, RLIMIT_NOFILE);
391+ADD_INT(module, RLIMIT_NOFILE);
401392#endif
402393403394#ifdef RLIMIT_OFILE
404-PyModule_AddIntMacro(m, RLIMIT_OFILE);
395+ADD_INT(module, RLIMIT_OFILE);
405396#endif
406397407398#ifdef RLIMIT_VMEM
408-PyModule_AddIntMacro(m, RLIMIT_VMEM);
399+ADD_INT(module, RLIMIT_VMEM);
409400#endif
410401411402#ifdef RLIMIT_AS
412-PyModule_AddIntMacro(m, RLIMIT_AS);
403+ADD_INT(module, RLIMIT_AS);
413404#endif
414405415406#ifdef RLIMIT_RSS
416-PyModule_AddIntMacro(m, RLIMIT_RSS);
407+ADD_INT(module, RLIMIT_RSS);
417408#endif
418409419410#ifdef RLIMIT_NPROC
420-PyModule_AddIntMacro(m, RLIMIT_NPROC);
411+ADD_INT(module, RLIMIT_NPROC);
421412#endif
422413423414#ifdef RLIMIT_MEMLOCK
424-PyModule_AddIntMacro(m, RLIMIT_MEMLOCK);
415+ADD_INT(module, RLIMIT_MEMLOCK);
425416#endif
426417427418#ifdef RLIMIT_SBSIZE
428-PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
419+ADD_INT(module, RLIMIT_SBSIZE);
429420#endif
430421431422/* Linux specific */
432423#ifdef RLIMIT_MSGQUEUE
433-PyModule_AddIntMacro(m, RLIMIT_MSGQUEUE);
424+ADD_INT(module, RLIMIT_MSGQUEUE);
434425#endif
435426436427#ifdef RLIMIT_NICE
437-PyModule_AddIntMacro(m, RLIMIT_NICE);
428+ADD_INT(module, RLIMIT_NICE);
438429#endif
439430440431#ifdef RLIMIT_RTPRIO
441-PyModule_AddIntMacro(m, RLIMIT_RTPRIO);
432+ADD_INT(module, RLIMIT_RTPRIO);
442433#endif
443434444435#ifdef RLIMIT_RTTIME
445-PyModule_AddIntMacro(m, RLIMIT_RTTIME);
436+ADD_INT(module, RLIMIT_RTTIME);
446437#endif
447438448439#ifdef RLIMIT_SIGPENDING
449-PyModule_AddIntMacro(m, RLIMIT_SIGPENDING);
440+ADD_INT(module, RLIMIT_SIGPENDING);
450441#endif
451442452443/* target */
453444#ifdef RUSAGE_SELF
454-PyModule_AddIntMacro(m, RUSAGE_SELF);
445+ADD_INT(module, RUSAGE_SELF);
455446#endif
456447457448#ifdef RUSAGE_CHILDREN
458-PyModule_AddIntMacro(m, RUSAGE_CHILDREN);
449+ADD_INT(module, RUSAGE_CHILDREN);
459450#endif
460451461452#ifdef RUSAGE_BOTH
462-PyModule_AddIntMacro(m, RUSAGE_BOTH);
453+ADD_INT(module, RUSAGE_BOTH);
463454#endif
464455465456#ifdef RUSAGE_THREAD
466-PyModule_AddIntMacro(m, RUSAGE_THREAD);
457+ADD_INT(module, RUSAGE_THREAD);
467458#endif
468459469460/* FreeBSD specific */
470461471462#ifdef RLIMIT_SWAP
472-PyModule_AddIntMacro(m, RLIMIT_SWAP);
463+ADD_INT(module, RLIMIT_SWAP);
473464#endif
474465475466#ifdef RLIMIT_SBSIZE
476-PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
467+ADD_INT(module, RLIMIT_SBSIZE);
477468#endif
478469479470#ifdef RLIMIT_NPTS
480-PyModule_AddIntMacro(m, RLIMIT_NPTS);
471+ADD_INT(module, RLIMIT_NPTS);
481472#endif
482473474+PyObject *v;
483475if (sizeof(RLIM_INFINITY) > sizeof(long)) {
484476v = PyLong_FromLongLong((long long) RLIM_INFINITY);
485477 } else
486478 {
487479v = PyLong_FromLong((long) RLIM_INFINITY);
488480 }
489-if (v) {
490-PyModule_AddObject(m, "RLIM_INFINITY", v);
481+if (!v) {
482+return -1;
483+ }
484+485+if (PyModule_AddObject(module, "RLIM_INFINITY", v) < 0) {
486+Py_DECREF(v);
487+return -1;
491488 }
489+492490initialized = 1;
493-return m;
491+return 0;
492+493+#undef ADD_INT
494+}
495+496+static struct PyModuleDef_Slot resource_slots[] = {
497+ {Py_mod_exec, resource_exec},
498+ {0, NULL}
499+};
500+501+static struct PyModuleDef resourcemodule = {
502+PyModuleDef_HEAD_INIT,
503+ .m_name = "resource",
504+ .m_size = 0,
505+ .m_methods = resource_methods,
506+ .m_slots = resource_slots,
507+};
508+509+PyMODINIT_FUNC
510+PyInit_resource(void)
511+{
512+return PyModuleDef_Init(&resourcemodule);
494513}