Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit bfaa8e2

Browse filesBrowse files
committed
bpo-1635741: Port select module to multiphase init
1 parent b437aa8 commit bfaa8e2
Copy full SHA for bfaa8e2

File tree

Expand file treeCollapse file tree

3 files changed

+110
-85
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+110
-85
lines changed
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Port :mod:`select` extension module to multiphase initialization
2+
(:pep:`489`).

‎Modules/clinic/selectmodule.c.h

Copy file name to clipboardExpand all lines: Modules/clinic/selectmodule.c.h
+3-3Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Modules/selectmodule.c

Copy file name to clipboardExpand all lines: Modules/selectmodule.c
+105-82Lines changed: 105 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -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]
8383
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"
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 */
9292
typedef struct {
@@ -709,10 +709,10 @@ select_poll_poll_impl(pollObject *self, PyObject *timeout_obj)
709709
}
710710

711711
static 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

10751075
static 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 *
11661166
select_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 *
11841184
select_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-
12431241
static PyObject *
12441242
pyepoll_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

16731672
static 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

17461745
typedef 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.");
23922392
static 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

24042406
static 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

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.