bpo-1635741: Port select module to multiphase init · python/cpython@bfaa8e2

@@ -77,16 +77,16 @@ get_select_state(PyObject *module)

7777

return (_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]

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]*/

90909191

/* 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

}

710710711711

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

};

1074107410751075

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

}

110511051106-

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

}

1171117111721172

#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;

124012401241-

#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

}

1672167116731672

static PyGetSetDef pyepoll_getsetlist[] = {

@@ -1741,15 +1740,13 @@ typedef struct {

17411740

struct 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))

1745174417461745

typedef struct {

17471746

PyObject_HEAD

17481747

SOCKET 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,

18901887

int op)

18911888

{

18921889

int result;

1890+

_selectstate *state = _selectstate_by_type(Py_TYPE(s));

189318911894-

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));

2116211521172116

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;

223122312232-

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

}

2403240524042406

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

}

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+

}

2469246224702463

PyModule_AddIntMacro(m, POLLIN);

24712464

PyModule_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+

}

2513250925142510

PyModule_AddIntMacro(m, EPOLLIN);

25152511

PyModule_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 */

25692569

PyModule_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

}