bpo-1635741: Port select module to multiphase init · python/cpython@bfaa8e2
@@ -77,16 +77,16 @@ get_select_state(PyObject *module)
7777return (_selectstate *)state;
7878}
797980-#define _selectstate_global get_select_state(PyState_FindModule(&selectmodule))
80+#define _selectstate_by_type(type) get_select_state(PyType_GetModule(type))
81818282/*[clinic input]
8383module select
84-class select.poll "pollObject *" "&poll_Type"
85-class select.devpoll "devpollObject *" "&devpoll_Type"
86-class select.epoll "pyEpoll_Object *" "&pyEpoll_Type"
87-class select.kqueue "kqueue_queue_Object *" "_selectstate_global->kqueue_queue_Type"
84+class select.poll "pollObject *" "_selectstate_by_type(type)->poll_Type"
85+class select.devpoll "devpollObject *" "_selectstate_by_type(type)->devpoll_Type"
86+class select.epoll "pyEpoll_Object *" "_selectstate_by_type(type)->pyEpoll_Type"
87+class select.kqueue "kqueue_queue_Object *" "_selectstate_by_type(type)->kqueue_queue_Type"
8888[clinic start generated code]*/
89-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=41071028e0ede093]*/
89+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=8072de35824aa327]*/
90909191/* list of Python objects and their file descriptor */
9292typedef struct {
@@ -709,10 +709,10 @@ select_poll_poll_impl(pollObject *self, PyObject *timeout_obj)
709709}
710710711711static pollObject *
712-newPollObject(void)
712+newPollObject(PyObject *module)
713713{
714714pollObject *self;
715-self = PyObject_New(pollObject, _selectstate_global->poll_Type);
715+self = PyObject_New(pollObject, get_select_state(module)->poll_Type);
716716if (self == NULL)
717717return NULL;
718718/* ufd_uptodate is a Boolean, denoting whether the
@@ -1073,7 +1073,7 @@ static PyGetSetDef devpoll_getsetlist[] = {
10731073};
1074107410751075static devpollObject *
1076-newDevPollObject(void)
1076+newDevPollObject(PyObject *module)
10771077{
10781078devpollObject *self;
10791079int fd_devpoll, limit_result;
@@ -1103,7 +1103,7 @@ newDevPollObject(void)
11031103return NULL;
11041104 }
110511051106-self = PyObject_New(devpollObject, _selectstate_global->devpoll_Type);
1106+self = PyObject_New(devpollObject, get_select_state(module)->devpoll_Type);
11071107if (self == NULL) {
11081108close(fd_devpoll);
11091109PyMem_DEL(fds);
@@ -1166,7 +1166,7 @@ static PyObject *
11661166select_poll_impl(PyObject *module)
11671167/*[clinic end generated code: output=16a665a4e1d228c5 input=3f877909d5696bbf]*/
11681168{
1169-return (PyObject *)newPollObject();
1169+return (PyObject *)newPollObject(module);
11701170}
1171117111721172#ifdef HAVE_SYS_DEVPOLL_H
@@ -1184,7 +1184,7 @@ static PyObject *
11841184select_devpoll_impl(PyObject *module)
11851185/*[clinic end generated code: output=ea9213cc87fd9581 input=53a1af94564f00a3]*/
11861186{
1187-return (PyObject *)newDevPollObject();
1187+return (PyObject *)newDevPollObject(module);
11881188}
11891189#endif
11901190@@ -1238,8 +1238,6 @@ typedef struct {
12381238SOCKET epfd; /* epoll control file descriptor */
12391239} pyEpoll_Object;
124012401241-#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), _selectstate_global->pyEpoll_Type))
1242-12431241static PyObject *
12441242pyepoll_err_closed(void)
12451243{
@@ -1667,7 +1665,8 @@ select_epoll___exit___impl(pyEpoll_Object *self, PyObject *exc_type,
16671665PyObject *exc_value, PyObject *exc_tb)
16681666/*[clinic end generated code: output=c480f38ce361748e input=7ae81a5a4c1a98d8]*/
16691667{
1670-return PyObject_CallMethodObjArgs((PyObject *)self, _selectstate_global->close, NULL);
1668+_selectstate *state = _selectstate_by_type(Py_TYPE(self));
1669+return PyObject_CallMethodObjArgs((PyObject *)self, state->close, NULL);
16711670}
1672167116731672static PyGetSetDef pyepoll_getsetlist[] = {
@@ -1741,15 +1740,13 @@ typedef struct {
17411740struct kevent e;
17421741} kqueue_event_Object;
174317421744-#define kqueue_event_Check(op) (PyObject_TypeCheck((op), _selectstate_global->kqueue_event_Type))
1743+#define kqueue_event_Check(op, state) (PyObject_TypeCheck((op), state->kqueue_event_Type))
1745174417461745typedef struct {
17471746PyObject_HEAD
17481747SOCKET kqfd; /* kqueue control fd */
17491748} kqueue_queue_Object;
175017491751-#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), _selectstate_global->kqueue_queue_Type))
1752-17531750#if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P)
17541751# error uintptr_t does not match void *!
17551752#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG)
@@ -1890,8 +1887,9 @@ kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
18901887int op)
18911888{
18921889int result;
1890+_selectstate *state = _selectstate_by_type(Py_TYPE(s));
189318911894-if (!kqueue_event_Check(o)) {
1892+if (!kqueue_event_Check(o, state)) {
18951893Py_RETURN_NOTIMPLEMENTED;
18961894 }
18971895@@ -2113,6 +2111,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
21132111struct timespec timeoutspec;
21142112struct timespec *ptimeoutspec;
21152113_PyTime_t timeout, deadline = 0;
2114+_selectstate *state = _selectstate_by_type(Py_TYPE(self));
2116211521172116if (self->kqfd < 0)
21182117return kqueue_queue_err_closed();
@@ -2165,9 +2164,10 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
21652164PyErr_NoMemory();
21662165 goto error;
21672166 }
2167+_selectstate *state = _selectstate_by_type(Py_TYPE(self));
21682168for (i = 0; i < nchanges; ++i) {
21692169ei = PySequence_Fast_GET_ITEM(seq, i);
2170-if (!kqueue_event_Check(ei)) {
2170+if (!kqueue_event_Check(ei, state)) {
21712171PyErr_SetString(PyExc_TypeError,
21722172"changelist must be an iterable of "
21732173"select.kevent objects");
@@ -2229,7 +2229,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
22292229for (i = 0; i < gotevents; i++) {
22302230kqueue_event_Object *ch;
223122312232-ch = PyObject_New(kqueue_event_Object, _selectstate_global->kqueue_event_Type);
2232+ch = PyObject_New(kqueue_event_Object, state->kqueue_event_Type);
22332233if (ch == NULL) {
22342234 goto error;
22352235 }
@@ -2392,24 +2392,28 @@ On Windows, only sockets are supported; on Unix, all file descriptors.");
23922392static int
23932393_select_traverse(PyObject *module, visitproc visit, void *arg)
23942394{
2395-Py_VISIT(get_select_state(module)->close);
2396-Py_VISIT(get_select_state(module)->poll_Type);
2397-Py_VISIT(get_select_state(module)->devpoll_Type);
2398-Py_VISIT(get_select_state(module)->pyEpoll_Type);
2399-Py_VISIT(get_select_state(module)->kqueue_event_Type);
2400-Py_VISIT(get_select_state(module)->kqueue_queue_Type);
2395+_selectstate *state = get_select_state(module);
2396+2397+Py_VISIT(state->close);
2398+Py_VISIT(state->poll_Type);
2399+Py_VISIT(state->devpoll_Type);
2400+Py_VISIT(state->pyEpoll_Type);
2401+Py_VISIT(state->kqueue_event_Type);
2402+Py_VISIT(state->kqueue_queue_Type);
24012403return 0;
24022404}
2403240524042406static int
24052407_select_clear(PyObject *module)
24062408{
2407-Py_CLEAR(get_select_state(module)->close);
2408-Py_CLEAR(get_select_state(module)->poll_Type);
2409-Py_CLEAR(get_select_state(module)->devpoll_Type);
2410-Py_CLEAR(get_select_state(module)->pyEpoll_Type);
2411-Py_CLEAR(get_select_state(module)->kqueue_event_Type);
2412-Py_CLEAR(get_select_state(module)->kqueue_queue_Type);
2409+_selectstate *state = get_select_state(module);
2410+2411+Py_CLEAR(state->close);
2412+Py_CLEAR(state->poll_Type);
2413+Py_CLEAR(state->devpoll_Type);
2414+Py_CLEAR(state->pyEpoll_Type);
2415+Py_CLEAR(state->kqueue_event_Type);
2416+Py_CLEAR(state->kqueue_queue_Type);
24132417return 0;
24142418}
24152419@@ -2419,30 +2423,18 @@ _select_free(void *module)
24192423_select_clear((PyObject *)module);
24202424}
242124252422-static struct PyModuleDef selectmodule = {
2423-PyModuleDef_HEAD_INIT,
2424-"select",
2425-module_doc,
2426-sizeof(_selectstate),
2427-select_methods,
2428-NULL,
2429-_select_traverse,
2430-_select_clear,
2431-_select_free,
2432-};
2433-2434-PyMODINIT_FUNC
2435-PyInit_select(void)
2426+int
2427+_select_exec(PyObject *m)
24362428{
2437-PyObject *m;
2438-m = PyModule_Create(&selectmodule);
2439-if (m == NULL)
2440-return NULL;
2429+_selectstate *state = get_select_state(m);
244124302442-get_select_state(m)->close = PyUnicode_InternFromString("close");
2443-2444-Py_INCREF(PyExc_OSError);
2445-PyModule_AddObject(m, "error", PyExc_OSError);
2431+state->close = PyUnicode_InternFromString("close");
2432+if (state->close == NULL) {
2433+return -1;
2434+ }
2435+if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) {
2436+return -1;
2437+ }
2446243824472439#ifdef PIPE_BUF
24482440#ifdef HAVE_BROKEN_PIPE_BUF
@@ -2462,10 +2454,11 @@ PyInit_select(void)
24622454#else
24632455 {
24642456#endif
2465-PyObject *poll_Type = PyType_FromSpec(&poll_Type_spec);
2466-if (poll_Type == NULL)
2467-return NULL;
2468-get_select_state(m)->poll_Type = (PyTypeObject *)poll_Type;
2457+state->poll_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2458+m, &poll_Type_spec, NULL);
2459+if (state->poll_Type == NULL) {
2460+return -1;
2461+ }
2469246224702463PyModule_AddIntMacro(m, POLLIN);
24712464PyModule_AddIntMacro(m, POLLPRI);
@@ -2497,19 +2490,22 @@ PyInit_select(void)
24972490#endif /* HAVE_POLL */
2498249124992492#ifdef HAVE_SYS_DEVPOLL_H
2500-PyObject *devpoll_Type = PyType_FromSpec(&devpoll_Type_spec);
2501-if (devpoll_Type == NULL)
2502-return NULL;
2503-get_select_state(m)->devpoll_Type = (PyTypeObject *)devpoll_Type;
2493+state->devpoll_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2494+m, &devpoll_Type_spec, NULL);
2495+if (state->devpoll_Type == NULL) {
2496+return -1;
2497+ }
25042498#endif
2505249925062500#ifdef HAVE_EPOLL
2507-PyObject *pyEpoll_Type = PyType_FromSpec(&pyEpoll_Type_spec);
2508-if (pyEpoll_Type == NULL)
2509-return NULL;
2510-get_select_state(m)->pyEpoll_Type = (PyTypeObject *)pyEpoll_Type;
2511-Py_INCREF(pyEpoll_Type);
2512-PyModule_AddObject(m, "epoll", (PyObject *)get_select_state(m)->pyEpoll_Type);
2501+state->pyEpoll_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2502+m, &pyEpoll_Type_spec, NULL);
2503+if (state->pyEpoll_Type == NULL) {
2504+return -1;
2505+ }
2506+if (PyModule_AddType(m, state->pyEpoll_Type) < 0) {
2507+return -1;
2508+ }
2513250925142510PyModule_AddIntMacro(m, EPOLLIN);
25152511PyModule_AddIntMacro(m, EPOLLOUT);
@@ -2551,19 +2547,23 @@ PyInit_select(void)
25512547#endif /* HAVE_EPOLL */
2552254825532549#ifdef HAVE_KQUEUE
2554-PyObject *kqueue_event_Type = PyType_FromSpec(&kqueue_event_Type_spec);
2555-if (kqueue_event_Type == NULL)
2556-return NULL;
2557-get_select_state(m)->kqueue_event_Type = (PyTypeObject *)kqueue_event_Type;
2558-Py_INCREF(get_select_state(m)->kqueue_event_Type);
2559-PyModule_AddObject(m, "kevent", kqueue_event_Type);
2550+state->kqueue_event_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2551+m, &kqueue_event_Type_spec, NULL);
2552+if (state->kqueue_event_Type == NULL) {
2553+return -1;
2554+ }
2555+if (PyModule_AddType(m, state->kqueue_event_Type) < 0) {
2556+return -1;
2557+ }
256025582561-PyObject *kqueue_queue_Type = PyType_FromSpec(&kqueue_queue_Type_spec);
2562-if (kqueue_queue_Type == NULL)
2563-return NULL;
2564-get_select_state(m)->kqueue_queue_Type = (PyTypeObject *)kqueue_queue_Type;
2565-Py_INCREF(get_select_state(m)->kqueue_queue_Type);
2566-PyModule_AddObject(m, "kqueue", kqueue_queue_Type);
2559+state->kqueue_queue_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2560+m, &kqueue_queue_Type_spec, NULL);
2561+if (state->kqueue_queue_Type == NULL) {
2562+return -1;
2563+ }
2564+if (PyModule_AddType(m, state->kqueue_queue_Type) < 0) {
2565+return -1;
2566+ }
2567256725682568/* event filters */
25692569PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
@@ -2640,5 +2640,28 @@ PyInit_select(void)
26402640#endif
2641264126422642#endif /* HAVE_KQUEUE */
2643-return m;
2643+return 0;
2644+}
2645+2646+static PyModuleDef_Slot _select_slots[] = {
2647+ {Py_mod_exec, _select_exec},
2648+ {0, NULL}
2649+};
2650+2651+static struct PyModuleDef selectmodule = {
2652+PyModuleDef_HEAD_INIT,
2653+ .m_name = "select",
2654+ .m_doc = module_doc,
2655+ .m_size = sizeof(_selectstate),
2656+ .m_methods = select_methods,
2657+ .m_slots = _select_slots,
2658+ .m_traverse = _select_traverse,
2659+ .m_clear = _select_clear,
2660+ .m_free = _select_free,
2661+};
2662+2663+PyMODINIT_FUNC
2664+PyInit_select(void)
2665+{
2666+return PyModuleDef_Init(&selectmodule);
26442667}