@@ -77,16 +77,16 @@ get_select_state(PyObject *module)
77
77
return (_selectstate * )state ;
78
78
}
79
79
80
- #define _selectstate_global get_select_state(PyState_FindModule(&selectmodule ))
80
+ #define _selectstate_by_type ( type ) get_select_state(PyType_GetModule(type ))
81
81
82
82
/*[clinic input]
83
83
module 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"
88
88
[clinic start generated code]*/
89
- /*[clinic end generated code: output=da39a3ee5e6b4b0d input=41071028e0ede093 ]*/
89
+ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=8072de35824aa327 ]*/
90
90
91
91
/* list of Python objects and their file descriptor */
92
92
typedef struct {
@@ -709,10 +709,10 @@ select_poll_poll_impl(pollObject *self, PyObject *timeout_obj)
709
709
}
710
710
711
711
static pollObject *
712
- newPollObject (void )
712
+ newPollObject (PyObject * module )
713
713
{
714
714
pollObject * self ;
715
- self = PyObject_New (pollObject , _selectstate_global -> poll_Type );
715
+ self = PyObject_New (pollObject , get_select_state ( module ) -> poll_Type );
716
716
if (self == NULL )
717
717
return NULL ;
718
718
/* ufd_uptodate is a Boolean, denoting whether the
@@ -1073,7 +1073,7 @@ static PyGetSetDef devpoll_getsetlist[] = {
1073
1073
};
1074
1074
1075
1075
static devpollObject *
1076
- newDevPollObject (void )
1076
+ newDevPollObject (PyObject * module )
1077
1077
{
1078
1078
devpollObject * self ;
1079
1079
int fd_devpoll , limit_result ;
@@ -1103,7 +1103,7 @@ newDevPollObject(void)
1103
1103
return NULL ;
1104
1104
}
1105
1105
1106
- self = PyObject_New (devpollObject , _selectstate_global -> devpoll_Type );
1106
+ self = PyObject_New (devpollObject , get_select_state ( module ) -> devpoll_Type );
1107
1107
if (self == NULL ) {
1108
1108
close (fd_devpoll );
1109
1109
PyMem_DEL (fds );
@@ -1166,7 +1166,7 @@ static PyObject *
1166
1166
select_poll_impl (PyObject * module )
1167
1167
/*[clinic end generated code: output=16a665a4e1d228c5 input=3f877909d5696bbf]*/
1168
1168
{
1169
- return (PyObject * )newPollObject ();
1169
+ return (PyObject * )newPollObject (module );
1170
1170
}
1171
1171
1172
1172
#ifdef HAVE_SYS_DEVPOLL_H
@@ -1184,7 +1184,7 @@ static PyObject *
1184
1184
select_devpoll_impl (PyObject * module )
1185
1185
/*[clinic end generated code: output=ea9213cc87fd9581 input=53a1af94564f00a3]*/
1186
1186
{
1187
- return (PyObject * )newDevPollObject ();
1187
+ return (PyObject * )newDevPollObject (module );
1188
1188
}
1189
1189
#endif
1190
1190
@@ -1238,8 +1238,6 @@ typedef struct {
1238
1238
SOCKET epfd ; /* epoll control file descriptor */
1239
1239
} pyEpoll_Object ;
1240
1240
1241
- #define pyepoll_CHECK (op ) (PyObject_TypeCheck((op), _selectstate_global->pyEpoll_Type))
1242
-
1243
1241
static PyObject *
1244
1242
pyepoll_err_closed (void )
1245
1243
{
@@ -1667,7 +1665,8 @@ select_epoll___exit___impl(pyEpoll_Object *self, PyObject *exc_type,
1667
1665
PyObject * exc_value , PyObject * exc_tb )
1668
1666
/*[clinic end generated code: output=c480f38ce361748e input=7ae81a5a4c1a98d8]*/
1669
1667
{
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 );
1671
1670
}
1672
1671
1673
1672
static PyGetSetDef pyepoll_getsetlist [] = {
@@ -1741,15 +1740,13 @@ typedef struct {
1741
1740
struct kevent e ;
1742
1741
} kqueue_event_Object ;
1743
1742
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))
1745
1744
1746
1745
typedef struct {
1747
1746
PyObject_HEAD
1748
1747
SOCKET kqfd ; /* kqueue control fd */
1749
1748
} kqueue_queue_Object ;
1750
1749
1751
- #define kqueue_queue_Check (op ) (PyObject_TypeCheck((op), _selectstate_global->kqueue_queue_Type))
1752
-
1753
1750
#if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P )
1754
1751
# error uintptr_t does not match void *!
1755
1752
#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG )
@@ -1890,8 +1887,9 @@ kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
1890
1887
int op )
1891
1888
{
1892
1889
int result ;
1890
+ _selectstate * state = _selectstate_by_type (Py_TYPE (s ));
1893
1891
1894
- if (!kqueue_event_Check (o )) {
1892
+ if (!kqueue_event_Check (o , state )) {
1895
1893
Py_RETURN_NOTIMPLEMENTED ;
1896
1894
}
1897
1895
@@ -2113,6 +2111,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
2113
2111
struct timespec timeoutspec ;
2114
2112
struct timespec * ptimeoutspec ;
2115
2113
_PyTime_t timeout , deadline = 0 ;
2114
+ _selectstate * state = _selectstate_by_type (Py_TYPE (self ));
2116
2115
2117
2116
if (self -> kqfd < 0 )
2118
2117
return kqueue_queue_err_closed ();
@@ -2165,9 +2164,10 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
2165
2164
PyErr_NoMemory ();
2166
2165
goto error ;
2167
2166
}
2167
+ _selectstate * state = _selectstate_by_type (Py_TYPE (self ));
2168
2168
for (i = 0 ; i < nchanges ; ++ i ) {
2169
2169
ei = PySequence_Fast_GET_ITEM (seq , i );
2170
- if (!kqueue_event_Check (ei )) {
2170
+ if (!kqueue_event_Check (ei , state )) {
2171
2171
PyErr_SetString (PyExc_TypeError ,
2172
2172
"changelist must be an iterable of "
2173
2173
"select.kevent objects" );
@@ -2229,7 +2229,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
2229
2229
for (i = 0 ; i < gotevents ; i ++ ) {
2230
2230
kqueue_event_Object * ch ;
2231
2231
2232
- ch = PyObject_New (kqueue_event_Object , _selectstate_global -> kqueue_event_Type );
2232
+ ch = PyObject_New (kqueue_event_Object , state -> kqueue_event_Type );
2233
2233
if (ch == NULL ) {
2234
2234
goto error ;
2235
2235
}
@@ -2392,24 +2392,28 @@ On Windows, only sockets are supported; on Unix, all file descriptors.");
2392
2392
static int
2393
2393
_select_traverse (PyObject * module , visitproc visit , void * arg )
2394
2394
{
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 );
2401
2403
return 0 ;
2402
2404
}
2403
2405
2404
2406
static int
2405
2407
_select_clear (PyObject * module )
2406
2408
{
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 );
2413
2417
return 0 ;
2414
2418
}
2415
2419
@@ -2419,30 +2423,18 @@ _select_free(void *module)
2419
2423
_select_clear ((PyObject * )module );
2420
2424
}
2421
2425
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 )
2436
2428
{
2437
- PyObject * m ;
2438
- m = PyModule_Create (& selectmodule );
2439
- if (m == NULL )
2440
- return NULL ;
2429
+ _selectstate * state = get_select_state (m );
2441
2430
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
+ }
2446
2438
2447
2439
#ifdef PIPE_BUF
2448
2440
#ifdef HAVE_BROKEN_PIPE_BUF
@@ -2462,10 +2454,11 @@ PyInit_select(void)
2462
2454
#else
2463
2455
{
2464
2456
#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
+ }
2469
2462
2470
2463
PyModule_AddIntMacro (m , POLLIN );
2471
2464
PyModule_AddIntMacro (m , POLLPRI );
@@ -2497,19 +2490,22 @@ PyInit_select(void)
2497
2490
#endif /* HAVE_POLL */
2498
2491
2499
2492
#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
+ }
2504
2498
#endif
2505
2499
2506
2500
#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
+ }
2513
2509
2514
2510
PyModule_AddIntMacro (m , EPOLLIN );
2515
2511
PyModule_AddIntMacro (m , EPOLLOUT );
@@ -2551,19 +2547,23 @@ PyInit_select(void)
2551
2547
#endif /* HAVE_EPOLL */
2552
2548
2553
2549
#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
+ }
2560
2558
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
+ }
2567
2567
2568
2568
/* event filters */
2569
2569
PyModule_AddIntConstant (m , "KQ_FILTER_READ" , EVFILT_READ );
@@ -2640,5 +2640,28 @@ PyInit_select(void)
2640
2640
#endif
2641
2641
2642
2642
#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 );
2644
2667
}
0 commit comments