@@ -77,16 +77,16 @@ get_select_state(PyObject *module)
7777 return (_selectstate * )state ;
7878}
7979
80- #define _selectstate_global get_select_state(PyState_FindModule(&selectmodule ))
80+ #define _selectstate_by_type ( type ) get_select_state(PyType_GetModule(type ))
8181
8282/*[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 ]*/
9090
9191/* list of Python objects and their file descriptor */
9292typedef struct {
@@ -709,10 +709,10 @@ select_poll_poll_impl(pollObject *self, PyObject *timeout_obj)
709709}
710710
711711static pollObject *
712- newPollObject (void )
712+ newPollObject (PyObject * module )
713713{
714714 pollObject * self ;
715- self = PyObject_New (pollObject , _selectstate_global -> poll_Type );
715+ self = PyObject_New (pollObject , get_select_state ( module ) -> poll_Type );
716716 if (self == NULL )
717717 return NULL ;
718718 /* ufd_uptodate is a Boolean, denoting whether the
@@ -1073,7 +1073,7 @@ static PyGetSetDef devpoll_getsetlist[] = {
10731073};
10741074
10751075static devpollObject *
1076- newDevPollObject (void )
1076+ newDevPollObject (PyObject * module )
10771077{
10781078 devpollObject * self ;
10791079 int fd_devpoll , limit_result ;
@@ -1103,7 +1103,7 @@ newDevPollObject(void)
11031103 return NULL ;
11041104 }
11051105
1106- self = PyObject_New (devpollObject , _selectstate_global -> devpoll_Type );
1106+ self = PyObject_New (devpollObject , get_select_state ( module ) -> devpoll_Type );
11071107 if (self == NULL ) {
11081108 close (fd_devpoll );
11091109 PyMem_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}
11711171
11721172#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 {
12381238 SOCKET epfd ; /* epoll control file descriptor */
12391239} pyEpoll_Object ;
12401240
1241- #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,
16671665 PyObject * 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}
16721671
16731672static PyGetSetDef pyepoll_getsetlist [] = {
@@ -1741,15 +1740,13 @@ typedef struct {
17411740 struct kevent e ;
17421741} kqueue_event_Object ;
17431742
1744- #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))
17451744
17461745typedef struct {
17471746 PyObject_HEAD
17481747 SOCKET kqfd ; /* kqueue control fd */
17491748} kqueue_queue_Object ;
17501749
1751- #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,
18901887 int op )
18911888{
18921889 int result ;
1890+ _selectstate * state = _selectstate_by_type (Py_TYPE (s ));
18931891
1894- if (!kqueue_event_Check (o )) {
1892+ if (!kqueue_event_Check (o , state )) {
18951893 Py_RETURN_NOTIMPLEMENTED ;
18961894 }
18971895
@@ -2113,6 +2111,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
21132111 struct timespec timeoutspec ;
21142112 struct timespec * ptimeoutspec ;
21152113 _PyTime_t timeout , deadline = 0 ;
2114+ _selectstate * state = _selectstate_by_type (Py_TYPE (self ));
21162115
21172116 if (self -> kqfd < 0 )
21182117 return kqueue_queue_err_closed ();
@@ -2165,9 +2164,10 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
21652164 PyErr_NoMemory ();
21662165 goto error ;
21672166 }
2167+ _selectstate * state = _selectstate_by_type (Py_TYPE (self ));
21682168 for (i = 0 ; i < nchanges ; ++ i ) {
21692169 ei = PySequence_Fast_GET_ITEM (seq , i );
2170- if (!kqueue_event_Check (ei )) {
2170+ if (!kqueue_event_Check (ei , state )) {
21712171 PyErr_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,
22292229 for (i = 0 ; i < gotevents ; i ++ ) {
22302230 kqueue_event_Object * ch ;
22312231
2232- ch = PyObject_New (kqueue_event_Object , _selectstate_global -> kqueue_event_Type );
2232+ ch = PyObject_New (kqueue_event_Object , state -> kqueue_event_Type );
22332233 if (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 );
24012403 return 0 ;
24022404}
24032405
24042406static 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 );
24132417 return 0 ;
24142418}
24152419
@@ -2419,30 +2423,18 @@ _select_free(void *module)
24192423 _select_clear ((PyObject * )module );
24202424}
24212425
2422- 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 );
24412430
2442- 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+ }
24462438
24472439#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+ }
24692462
24702463 PyModule_AddIntMacro (m , POLLIN );
24712464 PyModule_AddIntMacro (m , POLLPRI );
@@ -2497,19 +2490,22 @@ PyInit_select(void)
24972490#endif /* HAVE_POLL */
24982491
24992492#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
25052499
25062500#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+ }
25132509
25142510 PyModule_AddIntMacro (m , EPOLLIN );
25152511 PyModule_AddIntMacro (m , EPOLLOUT );
@@ -2551,19 +2547,23 @@ PyInit_select(void)
25512547#endif /* HAVE_EPOLL */
25522548
25532549#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+ }
25602558
2561- 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+ }
25672567
25682568 /* event filters */
25692569 PyModule_AddIntConstant (m , "KQ_FILTER_READ" , EVFILT_READ );
@@ -2640,5 +2640,28 @@ PyInit_select(void)
26402640#endif
26412641
26422642#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}
0 commit comments