1 /* select - Module containing unix select(2) call.
2 Under Unix, the file descriptors are small integers.
3 Under Win32, select only exists for sockets, and sockets may
4 have any value except INVALID_SOCKET.
5 */
6
7 #ifndef Py_BUILD_CORE_BUILTIN
8 # define Py_BUILD_CORE_MODULE 1
9 #endif
10
11 #if defined(HAVE_POLL_H) && !defined(_GNU_SOURCE)
12 # define _GNU_SOURCE
13 #endif
14
15 #include "Python.h"
16 #include "pycore_fileutils.h" // _Py_set_inheritable()
17 #include "structmember.h" // PyMemberDef
18
19 #ifdef HAVE_SYS_DEVPOLL_H
20 #include <sys/resource.h>
21 #include <sys/devpoll.h>
22 #include <sys/types.h>
23 #include <sys/stat.h>
24 #include <fcntl.h>
25 #endif
26
27 #ifdef __APPLE__
28 /* Perform runtime testing for a broken poll on OSX to make it easier
29 * to use the same binary on multiple releases of the OS.
30 */
31 #undef HAVE_BROKEN_POLL
32 #endif
33
34 /* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
35 64 is too small (too many people have bumped into that limit).
36 Here we boost it.
37 Users who want even more than the boosted limit should #define
38 FD_SETSIZE higher before this; e.g., via compiler /D switch.
39 */
40 #if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
41 #define FD_SETSIZE 512
42 #endif
43
44 #if defined(HAVE_POLL_H)
45 #include <poll.h>
46 #elif defined(HAVE_SYS_POLL_H)
47 #include <sys/poll.h>
48 #endif
49
50 #ifdef __sgi
51 /* This is missing from unistd.h */
52 extern void bzero(void *, int);
53 #endif
54
55 #ifdef HAVE_SYS_TYPES_H
56 #include <sys/types.h>
57 #endif
58
59 #ifdef MS_WINDOWS
60 # define WIN32_LEAN_AND_MEAN
61 # include <winsock.h>
62 #else
63 # define SOCKET int
64 #endif
65
66 // WASI SDK 16 does not have POLLPRIO, define as no-op
67 #if defined(__wasi__) && !defined(POLLPRI)
68 # define POLLPRI 0
69 #endif
70
71 typedef struct {
72 PyObject *close;
73 PyTypeObject *poll_Type;
74 PyTypeObject *devpoll_Type;
75 PyTypeObject *pyEpoll_Type;
76 PyTypeObject *kqueue_event_Type;
77 PyTypeObject *kqueue_queue_Type;
78 } _selectstate;
79
80 static struct PyModuleDef selectmodule;
81
82 static inline _selectstate*
get_select_state(PyObject * module)83 get_select_state(PyObject *module)
84 {
85 void *state = PyModule_GetState(module);
86 assert(state != NULL);
87 return (_selectstate *)state;
88 }
89
90 #define _selectstate_by_type(type) get_select_state(PyType_GetModule(type))
91
92 /*[clinic input]
93 module select
94 class select.poll "pollObject *" "_selectstate_by_type(type)->poll_Type"
95 class select.devpoll "devpollObject *" "_selectstate_by_type(type)->devpoll_Type"
96 class select.epoll "pyEpoll_Object *" "_selectstate_by_type(type)->pyEpoll_Type"
97 class select.kqueue "kqueue_queue_Object *" "_selectstate_by_type(type)->kqueue_queue_Type"
98 [clinic start generated code]*/
99 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=8072de35824aa327]*/
100
101 /* list of Python objects and their file descriptor */
102 typedef struct {
103 PyObject *obj; /* owned reference */
104 SOCKET fd;
105 int sentinel; /* -1 == sentinel */
106 } pylist;
107
108 static void
reap_obj(pylist fd2obj[FD_SETSIZE+1])109 reap_obj(pylist fd2obj[FD_SETSIZE + 1])
110 {
111 unsigned int i;
112 for (i = 0; i < (unsigned int)FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) {
113 Py_CLEAR(fd2obj[i].obj);
114 }
115 fd2obj[0].sentinel = -1;
116 }
117
118
119 /* returns -1 and sets the Python exception if an error occurred, otherwise
120 returns a number >= 0
121 */
122 static int
seq2set(PyObject * seq,fd_set * set,pylist fd2obj[FD_SETSIZE+1])123 seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
124 {
125 int max = -1;
126 unsigned int index = 0;
127 Py_ssize_t i;
128 PyObject* fast_seq = NULL;
129 PyObject* o = NULL;
130
131 fd2obj[0].obj = (PyObject*)0; /* set list to zero size */
132 FD_ZERO(set);
133
134 fast_seq = PySequence_Fast(seq, "arguments 1-3 must be sequences");
135 if (!fast_seq)
136 return -1;
137
138 for (i = 0; i < PySequence_Fast_GET_SIZE(fast_seq); i++) {
139 SOCKET v;
140
141 /* any intervening fileno() calls could decr this refcnt */
142 if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i)))
143 goto finally;
144
145 Py_INCREF(o);
146 v = PyObject_AsFileDescriptor( o );
147 if (v == -1) goto finally;
148
149 #if defined(_MSC_VER)
150 max = 0; /* not used for Win32 */
151 #else /* !_MSC_VER */
152 if (!_PyIsSelectable_fd(v)) {
153 PyErr_SetString(PyExc_ValueError,
154 "filedescriptor out of range in select()");
155 goto finally;
156 }
157 if (v > max)
158 max = v;
159 #endif /* _MSC_VER */
160 FD_SET(v, set);
161
162 /* add object and its file descriptor to the list */
163 if (index >= (unsigned int)FD_SETSIZE) {
164 PyErr_SetString(PyExc_ValueError,
165 "too many file descriptors in select()");
166 goto finally;
167 }
168 fd2obj[index].obj = o;
169 fd2obj[index].fd = v;
170 fd2obj[index].sentinel = 0;
171 fd2obj[++index].sentinel = -1;
172 }
173 Py_DECREF(fast_seq);
174 return max+1;
175
176 finally:
177 Py_XDECREF(o);
178 Py_DECREF(fast_seq);
179 return -1;
180 }
181
182 /* returns NULL and sets the Python exception if an error occurred */
183 static PyObject *
set2list(fd_set * set,pylist fd2obj[FD_SETSIZE+1])184 set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
185 {
186 int i, j, count=0;
187 PyObject *list, *o;
188 SOCKET fd;
189
190 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
191 if (FD_ISSET(fd2obj[j].fd, set))
192 count++;
193 }
194 list = PyList_New(count);
195 if (!list)
196 return NULL;
197
198 i = 0;
199 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
200 fd = fd2obj[j].fd;
201 if (FD_ISSET(fd, set)) {
202 o = fd2obj[j].obj;
203 fd2obj[j].obj = NULL;
204 /* transfer ownership */
205 if (PyList_SetItem(list, i, o) < 0)
206 goto finally;
207
208 i++;
209 }
210 }
211 return list;
212 finally:
213 Py_DECREF(list);
214 return NULL;
215 }
216
217 #undef SELECT_USES_HEAP
218 #if FD_SETSIZE > 1024
219 #define SELECT_USES_HEAP
220 #endif /* FD_SETSIZE > 1024 */
221
222 /*[clinic input]
223 select.select
224
225 rlist: object
226 wlist: object
227 xlist: object
228 timeout as timeout_obj: object = None
229 /
230
231 Wait until one or more file descriptors are ready for some kind of I/O.
232
233 The first three arguments are iterables of file descriptors to be waited for:
234 rlist -- wait until ready for reading
235 wlist -- wait until ready for writing
236 xlist -- wait for an "exceptional condition"
237 If only one kind of condition is required, pass [] for the other lists.
238
239 A file descriptor is either a socket or file object, or a small integer
240 gotten from a fileno() method call on one of those.
241
242 The optional 4th argument specifies a timeout in seconds; it may be
243 a floating point number to specify fractions of seconds. If it is absent
244 or None, the call will never time out.
245
246 The return value is a tuple of three lists corresponding to the first three
247 arguments; each contains the subset of the corresponding file descriptors
248 that are ready.
249
250 *** IMPORTANT NOTICE ***
251 On Windows, only sockets are supported; on Unix, all file
252 descriptors can be used.
253 [clinic start generated code]*/
254
255 static PyObject *
select_select_impl(PyObject * module,PyObject * rlist,PyObject * wlist,PyObject * xlist,PyObject * timeout_obj)256 select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist,
257 PyObject *xlist, PyObject *timeout_obj)
258 /*[clinic end generated code: output=2b3cfa824f7ae4cf input=e467f5d68033de00]*/
259 {
260 #ifdef SELECT_USES_HEAP
261 pylist *rfd2obj, *wfd2obj, *efd2obj;
262 #else /* !SELECT_USES_HEAP */
263 /* XXX: All this should probably be implemented as follows:
264 * - find the highest descriptor we're interested in
265 * - add one
266 * - that's the size
267 * See: Stevens, APitUE, $12.5.1
268 */
269 pylist rfd2obj[FD_SETSIZE + 1];
270 pylist wfd2obj[FD_SETSIZE + 1];
271 pylist efd2obj[FD_SETSIZE + 1];
272 #endif /* SELECT_USES_HEAP */
273 PyObject *ret = NULL;
274 fd_set ifdset, ofdset, efdset;
275 struct timeval tv, *tvp;
276 int imax, omax, emax, max;
277 int n;
278 _PyTime_t timeout, deadline = 0;
279
280 if (timeout_obj == Py_None)
281 tvp = (struct timeval *)NULL;
282 else {
283 if (_PyTime_FromSecondsObject(&timeout, timeout_obj,
284 _PyTime_ROUND_TIMEOUT) < 0) {
285 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
286 PyErr_SetString(PyExc_TypeError,
287 "timeout must be a float or None");
288 }
289 return NULL;
290 }
291
292 if (_PyTime_AsTimeval(timeout, &tv, _PyTime_ROUND_TIMEOUT) == -1)
293 return NULL;
294 if (tv.tv_sec < 0) {
295 PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
296 return NULL;
297 }
298 tvp = &tv;
299 }
300
301 #ifdef SELECT_USES_HEAP
302 /* Allocate memory for the lists */
303 rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
304 wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
305 efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
306 if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
307 if (rfd2obj) PyMem_Free(rfd2obj);
308 if (wfd2obj) PyMem_Free(wfd2obj);
309 if (efd2obj) PyMem_Free(efd2obj);
310 return PyErr_NoMemory();
311 }
312 #endif /* SELECT_USES_HEAP */
313
314 /* Convert iterables to fd_sets, and get maximum fd number
315 * propagates the Python exception set in seq2set()
316 */
317 rfd2obj[0].sentinel = -1;
318 wfd2obj[0].sentinel = -1;
319 efd2obj[0].sentinel = -1;
320 if ((imax = seq2set(rlist, &ifdset, rfd2obj)) < 0)
321 goto finally;
322 if ((omax = seq2set(wlist, &ofdset, wfd2obj)) < 0)
323 goto finally;
324 if ((emax = seq2set(xlist, &efdset, efd2obj)) < 0)
325 goto finally;
326
327 max = imax;
328 if (omax > max) max = omax;
329 if (emax > max) max = emax;
330
331 if (tvp) {
332 deadline = _PyDeadline_Init(timeout);
333 }
334
335 do {
336 Py_BEGIN_ALLOW_THREADS
337 errno = 0;
338 n = select(
339 max,
340 imax ? &ifdset : NULL,
341 omax ? &ofdset : NULL,
342 emax ? &efdset : NULL,
343 tvp);
344 Py_END_ALLOW_THREADS
345
346 if (errno != EINTR)
347 break;
348
349 /* select() was interrupted by a signal */
350 if (PyErr_CheckSignals())
351 goto finally;
352
353 if (tvp) {
354 timeout = _PyDeadline_Get(deadline);
355 if (timeout < 0) {
356 /* bpo-35310: lists were unmodified -- clear them explicitly */
357 FD_ZERO(&ifdset);
358 FD_ZERO(&ofdset);
359 FD_ZERO(&efdset);
360 n = 0;
361 break;
362 }
363 _PyTime_AsTimeval_clamp(timeout, &tv, _PyTime_ROUND_CEILING);
364 /* retry select() with the recomputed timeout */
365 }
366 } while (1);
367
368 #ifdef MS_WINDOWS
369 if (n == SOCKET_ERROR) {
370 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
371 }
372 #else
373 if (n < 0) {
374 PyErr_SetFromErrno(PyExc_OSError);
375 }
376 #endif
377 else {
378 /* any of these three calls can raise an exception. it's more
379 convenient to test for this after all three calls... but
380 is that acceptable?
381 */
382 rlist = set2list(&ifdset, rfd2obj);
383 wlist = set2list(&ofdset, wfd2obj);
384 xlist = set2list(&efdset, efd2obj);
385 if (PyErr_Occurred())
386 ret = NULL;
387 else
388 ret = PyTuple_Pack(3, rlist, wlist, xlist);
389
390 Py_XDECREF(rlist);
391 Py_XDECREF(wlist);
392 Py_XDECREF(xlist);
393 }
394
395 finally:
396 reap_obj(rfd2obj);
397 reap_obj(wfd2obj);
398 reap_obj(efd2obj);
399 #ifdef SELECT_USES_HEAP
400 PyMem_Free(rfd2obj);
401 PyMem_Free(wfd2obj);
402 PyMem_Free(efd2obj);
403 #endif /* SELECT_USES_HEAP */
404 return ret;
405 }
406
407 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
408 /*
409 * poll() support
410 */
411
412 typedef struct {
413 PyObject_HEAD
414 PyObject *dict;
415 int ufd_uptodate;
416 int ufd_len;
417 struct pollfd *ufds;
418 int poll_running;
419 } pollObject;
420
421 /* Update the malloc'ed array of pollfds to match the dictionary
422 contained within a pollObject. Return 1 on success, 0 on an error.
423 */
424
425 static int
update_ufd_array(pollObject * self)426 update_ufd_array(pollObject *self)
427 {
428 Py_ssize_t i, pos;
429 PyObject *key, *value;
430 struct pollfd *old_ufds = self->ufds;
431
432 self->ufd_len = PyDict_GET_SIZE(self->dict);
433 PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len);
434 if (self->ufds == NULL) {
435 self->ufds = old_ufds;
436 PyErr_NoMemory();
437 return 0;
438 }
439
440 i = pos = 0;
441 while (PyDict_Next(self->dict, &pos, &key, &value)) {
442 assert(i < self->ufd_len);
443 /* Never overflow */
444 self->ufds[i].fd = (int)PyLong_AsLong(key);
445 self->ufds[i].events = (short)(unsigned short)PyLong_AsLong(value);
446 i++;
447 }
448 assert(i == self->ufd_len);
449 self->ufd_uptodate = 1;
450 return 1;
451 }
452
453 /*[clinic input]
454 select.poll.register
455
456 fd: fildes
457 either an integer, or an object with a fileno() method returning an int
458 eventmask: unsigned_short(c_default="POLLIN | POLLPRI | POLLOUT") = select.POLLIN | select.POLLPRI | select.POLLOUT
459 an optional bitmask describing the type of events to check for
460 /
461
462 Register a file descriptor with the polling object.
463 [clinic start generated code]*/
464
465 static PyObject *
select_poll_register_impl(pollObject * self,int fd,unsigned short eventmask)466 select_poll_register_impl(pollObject *self, int fd, unsigned short eventmask)
467 /*[clinic end generated code: output=0dc7173c800a4a65 input=34e16cfb28d3c900]*/
468 {
469 PyObject *key, *value;
470 int err;
471
472 /* Add entry to the internal dictionary: the key is the
473 file descriptor, and the value is the event mask. */
474 key = PyLong_FromLong(fd);
475 if (key == NULL)
476 return NULL;
477 value = PyLong_FromLong(eventmask);
478 if (value == NULL) {
479 Py_DECREF(key);
480 return NULL;
481 }
482 err = PyDict_SetItem(self->dict, key, value);
483 Py_DECREF(key);
484 Py_DECREF(value);
485 if (err < 0)
486 return NULL;
487
488 self->ufd_uptodate = 0;
489
490 Py_RETURN_NONE;
491 }
492
493
494 /*[clinic input]
495 select.poll.modify
496
497 fd: fildes
498 either an integer, or an object with a fileno() method returning
499 an int
500 eventmask: unsigned_short
501 a bitmask describing the type of events to check for
502 /
503
504 Modify an already registered file descriptor.
505 [clinic start generated code]*/
506
507 static PyObject *
select_poll_modify_impl(pollObject * self,int fd,unsigned short eventmask)508 select_poll_modify_impl(pollObject *self, int fd, unsigned short eventmask)
509 /*[clinic end generated code: output=1a7b88bf079eff17 input=a8e383df075c32cf]*/
510 {
511 PyObject *key, *value;
512 int err;
513
514 /* Modify registered fd */
515 key = PyLong_FromLong(fd);
516 if (key == NULL)
517 return NULL;
518 err = PyDict_Contains(self->dict, key);
519 if (err < 0) {
520 Py_DECREF(key);
521 return NULL;
522 }
523 if (err == 0) {
524 errno = ENOENT;
525 PyErr_SetFromErrno(PyExc_OSError);
526 Py_DECREF(key);
527 return NULL;
528 }
529 value = PyLong_FromLong(eventmask);
530 if (value == NULL) {
531 Py_DECREF(key);
532 return NULL;
533 }
534 err = PyDict_SetItem(self->dict, key, value);
535 Py_DECREF(key);
536 Py_DECREF(value);
537 if (err < 0)
538 return NULL;
539
540 self->ufd_uptodate = 0;
541
542 Py_RETURN_NONE;
543 }
544
545
546 /*[clinic input]
547 select.poll.unregister
548
549 fd: fildes
550 /
551
552 Remove a file descriptor being tracked by the polling object.
553 [clinic start generated code]*/
554
555 static PyObject *
select_poll_unregister_impl(pollObject * self,int fd)556 select_poll_unregister_impl(pollObject *self, int fd)
557 /*[clinic end generated code: output=8c9f42e75e7d291b input=4b4fccc1040e79cb]*/
558 {
559 PyObject *key;
560
561 /* Check whether the fd is already in the array */
562 key = PyLong_FromLong(fd);
563 if (key == NULL)
564 return NULL;
565
566 if (PyDict_DelItem(self->dict, key) == -1) {
567 Py_DECREF(key);
568 /* This will simply raise the KeyError set by PyDict_DelItem
569 if the file descriptor isn't registered. */
570 return NULL;
571 }
572
573 Py_DECREF(key);
574 self->ufd_uptodate = 0;
575
576 Py_RETURN_NONE;
577 }
578
579 /*[clinic input]
580 select.poll.poll
581
582 timeout as timeout_obj: object = None
583 The maximum time to wait in milliseconds, or else None (or a negative
584 value) to wait indefinitely.
585 /
586
587 Polls the set of registered file descriptors.
588
589 Returns a list containing any descriptors that have events or errors to
590 report, as a list of (fd, event) 2-tuples.
591 [clinic start generated code]*/
592
593 static PyObject *
select_poll_poll_impl(pollObject * self,PyObject * timeout_obj)594 select_poll_poll_impl(pollObject *self, PyObject *timeout_obj)
595 /*[clinic end generated code: output=876e837d193ed7e4 input=c2f6953ec45e5622]*/
596 {
597 PyObject *result_list = NULL;
598 int poll_result, i, j;
599 PyObject *value = NULL, *num = NULL;
600 _PyTime_t timeout = -1, ms = -1, deadline = 0;
601 int async_err = 0;
602
603 if (timeout_obj != Py_None) {
604 if (_PyTime_FromMillisecondsObject(&timeout, timeout_obj,
605 _PyTime_ROUND_TIMEOUT) < 0) {
606 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
607 PyErr_SetString(PyExc_TypeError,
608 "timeout must be an integer or None");
609 }
610 return NULL;
611 }
612
613 ms = _PyTime_AsMilliseconds(timeout, _PyTime_ROUND_TIMEOUT);
614 if (ms < INT_MIN || ms > INT_MAX) {
615 PyErr_SetString(PyExc_OverflowError, "timeout is too large");
616 return NULL;
617 }
618
619 if (timeout >= 0) {
620 deadline = _PyDeadline_Init(timeout);
621 }
622 }
623
624 /* On some OSes, typically BSD-based ones, the timeout parameter of the
625 poll() syscall, when negative, must be exactly INFTIM, where defined,
626 or -1. See issue 31334. */
627 if (ms < 0) {
628 #ifdef INFTIM
629 ms = INFTIM;
630 #else
631 ms = -1;
632 #endif
633 }
634
635 /* Avoid concurrent poll() invocation, issue 8865 */
636 if (self->poll_running) {
637 PyErr_SetString(PyExc_RuntimeError,
638 "concurrent poll() invocation");
639 return NULL;
640 }
641
642 /* Ensure the ufd array is up to date */
643 if (!self->ufd_uptodate)
644 if (update_ufd_array(self) == 0)
645 return NULL;
646
647 self->poll_running = 1;
648
649 /* call poll() */
650 async_err = 0;
651 do {
652 Py_BEGIN_ALLOW_THREADS
653 errno = 0;
654 poll_result = poll(self->ufds, self->ufd_len, (int)ms);
655 Py_END_ALLOW_THREADS
656
657 if (errno != EINTR)
658 break;
659
660 /* poll() was interrupted by a signal */
661 if (PyErr_CheckSignals()) {
662 async_err = 1;
663 break;
664 }
665
666 if (timeout >= 0) {
667 timeout = _PyDeadline_Get(deadline);
668 if (timeout < 0) {
669 poll_result = 0;
670 break;
671 }
672 ms = _PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING);
673 /* retry poll() with the recomputed timeout */
674 }
675 } while (1);
676
677 self->poll_running = 0;
678
679 if (poll_result < 0) {
680 if (!async_err)
681 PyErr_SetFromErrno(PyExc_OSError);
682 return NULL;
683 }
684
685 /* build the result list */
686
687 result_list = PyList_New(poll_result);
688 if (!result_list)
689 return NULL;
690
691 for (i = 0, j = 0; j < poll_result; j++) {
692 /* skip to the next fired descriptor */
693 while (!self->ufds[i].revents) {
694 i++;
695 }
696 /* if we hit a NULL return, set value to NULL
697 and break out of loop; code at end will
698 clean up result_list */
699 value = PyTuple_New(2);
700 if (value == NULL)
701 goto error;
702 num = PyLong_FromLong(self->ufds[i].fd);
703 if (num == NULL) {
704 Py_DECREF(value);
705 goto error;
706 }
707 PyTuple_SET_ITEM(value, 0, num);
708
709 /* The &0xffff is a workaround for AIX. 'revents'
710 is a 16-bit short, and IBM assigned POLLNVAL
711 to be 0x8000, so the conversion to int results
712 in a negative number. See SF bug #923315. */
713 num = PyLong_FromLong(self->ufds[i].revents & 0xffff);
714 if (num == NULL) {
715 Py_DECREF(value);
716 goto error;
717 }
718 PyTuple_SET_ITEM(value, 1, num);
719 PyList_SET_ITEM(result_list, j, value);
720 i++;
721 }
722 return result_list;
723
724 error:
725 Py_DECREF(result_list);
726 return NULL;
727 }
728
729 static pollObject *
newPollObject(PyObject * module)730 newPollObject(PyObject *module)
731 {
732 pollObject *self;
733 self = PyObject_New(pollObject, get_select_state(module)->poll_Type);
734 if (self == NULL)
735 return NULL;
736 /* ufd_uptodate is a Boolean, denoting whether the
737 array pointed to by ufds matches the contents of the dictionary. */
738 self->ufd_uptodate = 0;
739 self->ufds = NULL;
740 self->poll_running = 0;
741 self->dict = PyDict_New();
742 if (self->dict == NULL) {
743 Py_DECREF(self);
744 return NULL;
745 }
746 return self;
747 }
748
749 static void
poll_dealloc(pollObject * self)750 poll_dealloc(pollObject *self)
751 {
752 PyObject* type = (PyObject *)Py_TYPE(self);
753 if (self->ufds != NULL)
754 PyMem_Free(self->ufds);
755 Py_XDECREF(self->dict);
756 PyObject_Free(self);
757 Py_DECREF(type);
758 }
759
760
761 #ifdef HAVE_SYS_DEVPOLL_H
762 static PyMethodDef devpoll_methods[];
763
764 typedef struct {
765 PyObject_HEAD
766 int fd_devpoll;
767 int max_n_fds;
768 int n_fds;
769 struct pollfd *fds;
770 } devpollObject;
771
772 static PyObject *
devpoll_err_closed(void)773 devpoll_err_closed(void)
774 {
775 PyErr_SetString(PyExc_ValueError, "I/O operation on closed devpoll object");
776 return NULL;
777 }
778
devpoll_flush(devpollObject * self)779 static int devpoll_flush(devpollObject *self)
780 {
781 int size, n;
782
783 if (!self->n_fds) return 0;
784
785 size = sizeof(struct pollfd)*self->n_fds;
786 self->n_fds = 0;
787
788 n = _Py_write(self->fd_devpoll, self->fds, size);
789 if (n == -1)
790 return -1;
791
792 if (n < size) {
793 /*
794 ** Data writed to /dev/poll is a binary data structure. It is not
795 ** clear what to do if a partial write occurred. For now, raise
796 ** an exception and see if we actually found this problem in
797 ** the wild.
798 ** See http://bugs.python.org/issue6397.
799 */
800 PyErr_Format(PyExc_OSError, "failed to write all pollfds. "
801 "Please, report at http://bugs.python.org/. "
802 "Data to report: Size tried: %d, actual size written: %d.",
803 size, n);
804 return -1;
805 }
806 return 0;
807 }
808
809 static PyObject *
internal_devpoll_register(devpollObject * self,int fd,unsigned short events,int remove)810 internal_devpoll_register(devpollObject *self, int fd,
811 unsigned short events, int remove)
812 {
813 if (self->fd_devpoll < 0)
814 return devpoll_err_closed();
815
816 if (remove) {
817 self->fds[self->n_fds].fd = fd;
818 self->fds[self->n_fds].events = POLLREMOVE;
819
820 if (++self->n_fds == self->max_n_fds) {
821 if (devpoll_flush(self))
822 return NULL;
823 }
824 }
825
826 self->fds[self->n_fds].fd = fd;
827 self->fds[self->n_fds].events = (signed short)events;
828
829 if (++self->n_fds == self->max_n_fds) {
830 if (devpoll_flush(self))
831 return NULL;
832 }
833
834 Py_RETURN_NONE;
835 }
836
837 /*[clinic input]
838 select.devpoll.register
839
840 fd: fildes
841 either an integer, or an object with a fileno() method returning
842 an int
843 eventmask: unsigned_short(c_default="POLLIN | POLLPRI | POLLOUT") = select.POLLIN | select.POLLPRI | select.POLLOUT
844 an optional bitmask describing the type of events to check for
845 /
846
847 Register a file descriptor with the polling object.
848 [clinic start generated code]*/
849
850 static PyObject *
select_devpoll_register_impl(devpollObject * self,int fd,unsigned short eventmask)851 select_devpoll_register_impl(devpollObject *self, int fd,
852 unsigned short eventmask)
853 /*[clinic end generated code: output=6e07fe8b74abba0c input=22006fabe9567522]*/
854 {
855 return internal_devpoll_register(self, fd, eventmask, 0);
856 }
857
858 /*[clinic input]
859 select.devpoll.modify
860
861 fd: fildes
862 either an integer, or an object with a fileno() method returning
863 an int
864 eventmask: unsigned_short(c_default="POLLIN | POLLPRI | POLLOUT") = select.POLLIN | select.POLLPRI | select.POLLOUT
865 an optional bitmask describing the type of events to check for
866 /
867
868 Modify a possible already registered file descriptor.
869 [clinic start generated code]*/
870
871 static PyObject *
select_devpoll_modify_impl(devpollObject * self,int fd,unsigned short eventmask)872 select_devpoll_modify_impl(devpollObject *self, int fd,
873 unsigned short eventmask)
874 /*[clinic end generated code: output=bc2e6d23aaff98b4 input=09fa335db7cdc09e]*/
875 {
876 return internal_devpoll_register(self, fd, eventmask, 1);
877 }
878
879 /*[clinic input]
880 select.devpoll.unregister
881
882 fd: fildes
883 /
884
885 Remove a file descriptor being tracked by the polling object.
886 [clinic start generated code]*/
887
888 static PyObject *
select_devpoll_unregister_impl(devpollObject * self,int fd)889 select_devpoll_unregister_impl(devpollObject *self, int fd)
890 /*[clinic end generated code: output=95519ffa0c7d43fe input=b4ea42a4442fd467]*/
891 {
892 if (self->fd_devpoll < 0)
893 return devpoll_err_closed();
894
895 self->fds[self->n_fds].fd = fd;
896 self->fds[self->n_fds].events = POLLREMOVE;
897
898 if (++self->n_fds == self->max_n_fds) {
899 if (devpoll_flush(self))
900 return NULL;
901 }
902
903 Py_RETURN_NONE;
904 }
905
906 /*[clinic input]
907 select.devpoll.poll
908 timeout as timeout_obj: object = None
909 The maximum time to wait in milliseconds, or else None (or a negative
910 value) to wait indefinitely.
911 /
912
913 Polls the set of registered file descriptors.
914
915 Returns a list containing any descriptors that have events or errors to
916 report, as a list of (fd, event) 2-tuples.
917 [clinic start generated code]*/
918
919 static PyObject *
select_devpoll_poll_impl(devpollObject * self,PyObject * timeout_obj)920 select_devpoll_poll_impl(devpollObject *self, PyObject *timeout_obj)
921 /*[clinic end generated code: output=2654e5457cca0b3c input=3c3f0a355ec2bedb]*/
922 {
923 struct dvpoll dvp;
924 PyObject *result_list = NULL;
925 int poll_result, i;
926 PyObject *value, *num1, *num2;
927 _PyTime_t timeout, ms, deadline = 0;
928
929 if (self->fd_devpoll < 0)
930 return devpoll_err_closed();
931
932 /* Check values for timeout */
933 if (timeout_obj == Py_None) {
934 timeout = -1;
935 ms = -1;
936 }
937 else {
938 if (_PyTime_FromMillisecondsObject(&timeout, timeout_obj,
939 _PyTime_ROUND_TIMEOUT) < 0) {
940 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
941 PyErr_SetString(PyExc_TypeError,
942 "timeout must be an integer or None");
943 }
944 return NULL;
945 }
946
947 ms = _PyTime_AsMilliseconds(timeout, _PyTime_ROUND_TIMEOUT);
948 if (ms < -1 || ms > INT_MAX) {
949 PyErr_SetString(PyExc_OverflowError, "timeout is too large");
950 return NULL;
951 }
952 }
953
954 if (devpoll_flush(self))
955 return NULL;
956
957 dvp.dp_fds = self->fds;
958 dvp.dp_nfds = self->max_n_fds;
959 dvp.dp_timeout = (int)ms;
960
961 if (timeout >= 0) {
962 deadline = _PyDeadline_Init(timeout);
963 }
964
965 do {
966 /* call devpoll() */
967 Py_BEGIN_ALLOW_THREADS
968 errno = 0;
969 poll_result = ioctl(self->fd_devpoll, DP_POLL, &dvp);
970 Py_END_ALLOW_THREADS
971
972 if (errno != EINTR)
973 break;
974
975 /* devpoll() was interrupted by a signal */
976 if (PyErr_CheckSignals())
977 return NULL;
978
979 if (timeout >= 0) {
980 timeout = _PyDeadline_Get(deadline);
981 if (timeout < 0) {
982 poll_result = 0;
983 break;
984 }
985 ms = _PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING);
986 dvp.dp_timeout = (int)ms;
987 /* retry devpoll() with the recomputed timeout */
988 }
989 } while (1);
990
991 if (poll_result < 0) {
992 PyErr_SetFromErrno(PyExc_OSError);
993 return NULL;
994 }
995
996 /* build the result list */
997 result_list = PyList_New(poll_result);
998 if (!result_list)
999 return NULL;
1000
1001 for (i = 0; i < poll_result; i++) {
1002 num1 = PyLong_FromLong(self->fds[i].fd);
1003 num2 = PyLong_FromLong(self->fds[i].revents);
1004 if ((num1 == NULL) || (num2 == NULL)) {
1005 Py_XDECREF(num1);
1006 Py_XDECREF(num2);
1007 goto error;
1008 }
1009 value = PyTuple_Pack(2, num1, num2);
1010 Py_DECREF(num1);
1011 Py_DECREF(num2);
1012 if (value == NULL)
1013 goto error;
1014 PyList_SET_ITEM(result_list, i, value);
1015 }
1016
1017 return result_list;
1018
1019 error:
1020 Py_DECREF(result_list);
1021 return NULL;
1022 }
1023
1024 static int
devpoll_internal_close(devpollObject * self)1025 devpoll_internal_close(devpollObject *self)
1026 {
1027 int save_errno = 0;
1028 if (self->fd_devpoll >= 0) {
1029 int fd = self->fd_devpoll;
1030 self->fd_devpoll = -1;
1031 Py_BEGIN_ALLOW_THREADS
1032 if (close(fd) < 0)
1033 save_errno = errno;
1034 Py_END_ALLOW_THREADS
1035 }
1036 return save_errno;
1037 }
1038
1039 /*[clinic input]
1040 select.devpoll.close
1041
1042 Close the devpoll file descriptor.
1043
1044 Further operations on the devpoll object will raise an exception.
1045 [clinic start generated code]*/
1046
1047 static PyObject *
select_devpoll_close_impl(devpollObject * self)1048 select_devpoll_close_impl(devpollObject *self)
1049 /*[clinic end generated code: output=26b355bd6429f21b input=6273c30f5560a99b]*/
1050 {
1051 errno = devpoll_internal_close(self);
1052 if (errno < 0) {
1053 PyErr_SetFromErrno(PyExc_OSError);
1054 return NULL;
1055 }
1056 Py_RETURN_NONE;
1057 }
1058
1059 static PyObject*
devpoll_get_closed(devpollObject * self,void * Py_UNUSED (ignored))1060 devpoll_get_closed(devpollObject *self, void *Py_UNUSED(ignored))
1061 {
1062 if (self->fd_devpoll < 0)
1063 Py_RETURN_TRUE;
1064 else
1065 Py_RETURN_FALSE;
1066 }
1067
1068 /*[clinic input]
1069 select.devpoll.fileno
1070
1071 Return the file descriptor.
1072 [clinic start generated code]*/
1073
1074 static PyObject *
select_devpoll_fileno_impl(devpollObject * self)1075 select_devpoll_fileno_impl(devpollObject *self)
1076 /*[clinic end generated code: output=26920929f8d292f4 input=ef15331ebde6c368]*/
1077 {
1078 if (self->fd_devpoll < 0)
1079 return devpoll_err_closed();
1080 return PyLong_FromLong(self->fd_devpoll);
1081 }
1082
1083 static PyGetSetDef devpoll_getsetlist[] = {
1084 {"closed", (getter)devpoll_get_closed, NULL,
1085 "True if the devpoll object is closed"},
1086 {0},
1087 };
1088
1089 static devpollObject *
newDevPollObject(PyObject * module)1090 newDevPollObject(PyObject *module)
1091 {
1092 devpollObject *self;
1093 int fd_devpoll, limit_result;
1094 struct pollfd *fds;
1095 struct rlimit limit;
1096
1097 /*
1098 ** If we try to process more that getrlimit()
1099 ** fds, the kernel will give an error, so
1100 ** we set the limit here. It is a dynamic
1101 ** value, because we can change rlimit() anytime.
1102 */
1103 limit_result = getrlimit(RLIMIT_NOFILE, &limit);
1104 if (limit_result == -1) {
1105 PyErr_SetFromErrno(PyExc_OSError);
1106 return NULL;
1107 }
1108
1109 fd_devpoll = _Py_open("/dev/poll", O_RDWR);
1110 if (fd_devpoll == -1)
1111 return NULL;
1112
1113 fds = PyMem_NEW(struct pollfd, limit.rlim_cur);
1114 if (fds == NULL) {
1115 close(fd_devpoll);
1116 PyErr_NoMemory();
1117 return NULL;
1118 }
1119
1120 self = PyObject_New(devpollObject, get_select_state(module)->devpoll_Type);
1121 if (self == NULL) {
1122 close(fd_devpoll);
1123 PyMem_Free(fds);
1124 return NULL;
1125 }
1126 self->fd_devpoll = fd_devpoll;
1127 self->max_n_fds = limit.rlim_cur;
1128 self->n_fds = 0;
1129 self->fds = fds;
1130
1131 return self;
1132 }
1133
1134 static void
devpoll_dealloc(devpollObject * self)1135 devpoll_dealloc(devpollObject *self)
1136 {
1137 PyObject *type = (PyObject *)Py_TYPE(self);
1138 (void)devpoll_internal_close(self);
1139 PyMem_Free(self->fds);
1140 PyObject_Free(self);
1141 Py_DECREF(type);
1142 }
1143
1144 static PyType_Slot devpoll_Type_slots[] = {
1145 {Py_tp_dealloc, devpoll_dealloc},
1146 {Py_tp_getset, devpoll_getsetlist},
1147 {Py_tp_methods, devpoll_methods},
1148 {0, 0},
1149 };
1150
1151 static PyType_Spec devpoll_Type_spec = {
1152 "select.devpoll",
1153 sizeof(devpollObject),
1154 0,
1155 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
1156 devpoll_Type_slots
1157 };
1158
1159 #endif /* HAVE_SYS_DEVPOLL_H */
1160
1161
1162 /*[clinic input]
1163 select.poll
1164
1165 Returns a polling object.
1166
1167 This object supports registering and unregistering file descriptors, and then
1168 polling them for I/O events.
1169 [clinic start generated code]*/
1170
1171 static PyObject *
select_poll_impl(PyObject * module)1172 select_poll_impl(PyObject *module)
1173 /*[clinic end generated code: output=16a665a4e1d228c5 input=3f877909d5696bbf]*/
1174 {
1175 return (PyObject *)newPollObject(module);
1176 }
1177
1178 #ifdef HAVE_SYS_DEVPOLL_H
1179
1180 /*[clinic input]
1181 select.devpoll
1182
1183 Returns a polling object.
1184
1185 This object supports registering and unregistering file descriptors, and then
1186 polling them for I/O events.
1187 [clinic start generated code]*/
1188
1189 static PyObject *
select_devpoll_impl(PyObject * module)1190 select_devpoll_impl(PyObject *module)
1191 /*[clinic end generated code: output=ea9213cc87fd9581 input=53a1af94564f00a3]*/
1192 {
1193 return (PyObject *)newDevPollObject(module);
1194 }
1195 #endif
1196
1197
1198 #ifdef __APPLE__
1199 /*
1200 * On some systems poll() sets errno on invalid file descriptors. We test
1201 * for this at runtime because this bug may be fixed or introduced between
1202 * OS releases.
1203 */
select_have_broken_poll(void)1204 static int select_have_broken_poll(void)
1205 {
1206 int poll_test;
1207 int filedes[2];
1208
1209 struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 };
1210
1211 /* Create a file descriptor to make invalid */
1212 if (pipe(filedes) < 0) {
1213 return 1;
1214 }
1215 poll_struct.fd = filedes[0];
1216 close(filedes[0]);
1217 close(filedes[1]);
1218 poll_test = poll(&poll_struct, 1, 0);
1219 if (poll_test < 0) {
1220 return 1;
1221 } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) {
1222 return 1;
1223 }
1224 return 0;
1225 }
1226 #endif /* __APPLE__ */
1227
1228 #endif /* HAVE_POLL */
1229
1230 #ifdef HAVE_EPOLL
1231 /* **************************************************************************
1232 * epoll interface for Linux 2.6
1233 *
1234 * Written by Christian Heimes
1235 * Inspired by Twisted's _epoll.pyx and select.poll()
1236 */
1237
1238 #ifdef HAVE_SYS_EPOLL_H
1239 #include <sys/epoll.h>
1240 #endif
1241
1242 typedef struct {
1243 PyObject_HEAD
1244 SOCKET epfd; /* epoll control file descriptor */
1245 } pyEpoll_Object;
1246
1247 static PyObject *
pyepoll_err_closed(void)1248 pyepoll_err_closed(void)
1249 {
1250 PyErr_SetString(PyExc_ValueError, "I/O operation on closed epoll object");
1251 return NULL;
1252 }
1253
1254 static int
pyepoll_internal_close(pyEpoll_Object * self)1255 pyepoll_internal_close(pyEpoll_Object *self)
1256 {
1257 int save_errno = 0;
1258 if (self->epfd >= 0) {
1259 int epfd = self->epfd;
1260 self->epfd = -1;
1261 Py_BEGIN_ALLOW_THREADS
1262 if (close(epfd) < 0)
1263 save_errno = errno;
1264 Py_END_ALLOW_THREADS
1265 }
1266 return save_errno;
1267 }
1268
1269 static PyObject *
newPyEpoll_Object(PyTypeObject * type,int sizehint,SOCKET fd)1270 newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
1271 {
1272 pyEpoll_Object *self;
1273 assert(type != NULL);
1274 allocfunc epoll_alloc = PyType_GetSlot(type, Py_tp_alloc);
1275 assert(epoll_alloc != NULL);
1276 self = (pyEpoll_Object *) epoll_alloc(type, 0);
1277 if (self == NULL)
1278 return NULL;
1279
1280 if (fd == -1) {
1281 Py_BEGIN_ALLOW_THREADS
1282 #ifdef HAVE_EPOLL_CREATE1
1283 self->epfd = epoll_create1(EPOLL_CLOEXEC);
1284 #else
1285 self->epfd = epoll_create(sizehint);
1286 #endif
1287 Py_END_ALLOW_THREADS
1288 }
1289 else {
1290 self->epfd = fd;
1291 }
1292 if (self->epfd < 0) {
1293 Py_DECREF(self);
1294 PyErr_SetFromErrno(PyExc_OSError);
1295 return NULL;
1296 }
1297
1298 #ifndef HAVE_EPOLL_CREATE1
1299 if (fd == -1 && _Py_set_inheritable(self->epfd, 0, NULL) < 0) {
1300 Py_DECREF(self);
1301 return NULL;
1302 }
1303 #endif
1304
1305 return (PyObject *)self;
1306 }
1307
1308
1309 /*[clinic input]
1310 @classmethod
1311 select.epoll.__new__
1312
1313 sizehint: int = -1
1314 The expected number of events to be registered. It must be positive,
1315 or -1 to use the default. It is only used on older systems where
1316 epoll_create1() is not available; otherwise it has no effect (though its
1317 value is still checked).
1318 flags: int = 0
1319 Deprecated and completely ignored. However, when supplied, its value
1320 must be 0 or select.EPOLL_CLOEXEC, otherwise OSError is raised.
1321
1322 Returns an epolling object.
1323 [clinic start generated code]*/
1324
1325 static PyObject *
select_epoll_impl(PyTypeObject * type,int sizehint,int flags)1326 select_epoll_impl(PyTypeObject *type, int sizehint, int flags)
1327 /*[clinic end generated code: output=c87404e705013bb5 input=303e3295e7975e43]*/
1328 {
1329 if (sizehint == -1) {
1330 sizehint = FD_SETSIZE - 1;
1331 }
1332 else if (sizehint <= 0) {
1333 PyErr_SetString(PyExc_ValueError, "negative sizehint");
1334 return NULL;
1335 }
1336
1337 #ifdef HAVE_EPOLL_CREATE1
1338 if (flags && flags != EPOLL_CLOEXEC) {
1339 PyErr_SetString(PyExc_OSError, "invalid flags");
1340 return NULL;
1341 }
1342 #endif
1343
1344 return newPyEpoll_Object(type, sizehint, -1);
1345 }
1346
1347
1348 static void
pyepoll_dealloc(pyEpoll_Object * self)1349 pyepoll_dealloc(pyEpoll_Object *self)
1350 {
1351 PyTypeObject* type = Py_TYPE(self);
1352 (void)pyepoll_internal_close(self);
1353 freefunc epoll_free = PyType_GetSlot(type, Py_tp_free);
1354 epoll_free((PyObject *)self);
1355 Py_DECREF((PyObject *)type);
1356 }
1357
1358 /*[clinic input]
1359 select.epoll.close
1360
1361 Close the epoll control file descriptor.
1362
1363 Further operations on the epoll object will raise an exception.
1364 [clinic start generated code]*/
1365
1366 static PyObject *
select_epoll_close_impl(pyEpoll_Object * self)1367 select_epoll_close_impl(pyEpoll_Object *self)
1368 /*[clinic end generated code: output=ee2144c446a1a435 input=ca6c66ba5a736bfd]*/
1369 {
1370 errno = pyepoll_internal_close(self);
1371 if (errno < 0) {
1372 PyErr_SetFromErrno(PyExc_OSError);
1373 return NULL;
1374 }
1375 Py_RETURN_NONE;
1376 }
1377
1378
1379 static PyObject*
pyepoll_get_closed(pyEpoll_Object * self,void * Py_UNUSED (ignored))1380 pyepoll_get_closed(pyEpoll_Object *self, void *Py_UNUSED(ignored))
1381 {
1382 if (self->epfd < 0)
1383 Py_RETURN_TRUE;
1384 else
1385 Py_RETURN_FALSE;
1386 }
1387
1388 /*[clinic input]
1389 select.epoll.fileno
1390
1391 Return the epoll control file descriptor.
1392 [clinic start generated code]*/
1393
1394 static PyObject *
select_epoll_fileno_impl(pyEpoll_Object * self)1395 select_epoll_fileno_impl(pyEpoll_Object *self)
1396 /*[clinic end generated code: output=e171375fdc619ba3 input=c11091a6aee60b5c]*/
1397 {
1398 if (self->epfd < 0)
1399 return pyepoll_err_closed();
1400 return PyLong_FromLong(self->epfd);
1401 }
1402
1403
1404 /*[clinic input]
1405 @classmethod
1406 select.epoll.fromfd
1407
1408 fd: int
1409 /
1410
1411 Create an epoll object from a given control fd.
1412 [clinic start generated code]*/
1413
1414 static PyObject *
select_epoll_fromfd_impl(PyTypeObject * type,int fd)1415 select_epoll_fromfd_impl(PyTypeObject *type, int fd)
1416 /*[clinic end generated code: output=c15de2a083524e8e input=faecefdb55e3046e]*/
1417 {
1418 SOCKET s_fd = (SOCKET)fd;
1419 return newPyEpoll_Object(type, FD_SETSIZE - 1, s_fd);
1420 }
1421
1422
1423 static PyObject *
pyepoll_internal_ctl(int epfd,int op,int fd,unsigned int events)1424 pyepoll_internal_ctl(int epfd, int op, int fd, unsigned int events)
1425 {
1426 struct epoll_event ev;
1427 int result;
1428
1429 if (epfd < 0)
1430 return pyepoll_err_closed();
1431
1432 switch (op) {
1433 case EPOLL_CTL_ADD:
1434 case EPOLL_CTL_MOD:
1435 ev.events = events;
1436 ev.data.fd = fd;
1437 Py_BEGIN_ALLOW_THREADS
1438 result = epoll_ctl(epfd, op, fd, &ev);
1439 Py_END_ALLOW_THREADS
1440 break;
1441 case EPOLL_CTL_DEL:
1442 /* In kernel versions before 2.6.9, the EPOLL_CTL_DEL
1443 * operation required a non-NULL pointer in event, even
1444 * though this argument is ignored. */
1445 Py_BEGIN_ALLOW_THREADS
1446 result = epoll_ctl(epfd, op, fd, &ev);
1447 Py_END_ALLOW_THREADS
1448 break;
1449 default:
1450 result = -1;
1451 errno = EINVAL;
1452 }
1453
1454 if (result < 0) {
1455 PyErr_SetFromErrno(PyExc_OSError);
1456 return NULL;
1457 }
1458 Py_RETURN_NONE;
1459 }
1460
1461 /*[clinic input]
1462 select.epoll.register
1463
1464 fd: fildes
1465 the target file descriptor of the operation
1466 eventmask: unsigned_int(c_default="EPOLLIN | EPOLLPRI | EPOLLOUT", bitwise=True) = select.EPOLLIN | select.EPOLLPRI | select.EPOLLOUT
1467 a bit set composed of the various EPOLL constants
1468
1469 Registers a new fd or raises an OSError if the fd is already registered.
1470
1471 The epoll interface supports all file descriptors that support poll.
1472 [clinic start generated code]*/
1473
1474 static PyObject *
select_epoll_register_impl(pyEpoll_Object * self,int fd,unsigned int eventmask)1475 select_epoll_register_impl(pyEpoll_Object *self, int fd,
1476 unsigned int eventmask)
1477 /*[clinic end generated code: output=318e5e6386520599 input=a5071b71edfe3578]*/
1478 {
1479 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_ADD, fd, eventmask);
1480 }
1481
1482 /*[clinic input]
1483 select.epoll.modify
1484
1485 fd: fildes
1486 the target file descriptor of the operation
1487 eventmask: unsigned_int(bitwise=True)
1488 a bit set composed of the various EPOLL constants
1489
1490 Modify event mask for a registered file descriptor.
1491 [clinic start generated code]*/
1492
1493 static PyObject *
select_epoll_modify_impl(pyEpoll_Object * self,int fd,unsigned int eventmask)1494 select_epoll_modify_impl(pyEpoll_Object *self, int fd,
1495 unsigned int eventmask)
1496 /*[clinic end generated code: output=7e3447307cff6f65 input=88a83dac53a8c3da]*/
1497 {
1498 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_MOD, fd, eventmask);
1499 }
1500
1501 /*[clinic input]
1502 select.epoll.unregister
1503
1504 fd: fildes
1505 the target file descriptor of the operation
1506
1507 Remove a registered file descriptor from the epoll object.
1508 [clinic start generated code]*/
1509
1510 static PyObject *
select_epoll_unregister_impl(pyEpoll_Object * self,int fd)1511 select_epoll_unregister_impl(pyEpoll_Object *self, int fd)
1512 /*[clinic end generated code: output=07c5dbd612a512d4 input=3093f68d3644743d]*/
1513 {
1514 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_DEL, fd, 0);
1515 }
1516
1517 /*[clinic input]
1518 select.epoll.poll
1519
1520 timeout as timeout_obj: object = None
1521 the maximum time to wait in seconds (as float);
1522 a timeout of None or -1 makes poll wait indefinitely
1523 maxevents: int = -1
1524 the maximum number of events returned; -1 means no limit
1525
1526 Wait for events on the epoll file descriptor.
1527
1528 Returns a list containing any descriptors that have events to report,
1529 as a list of (fd, events) 2-tuples.
1530 [clinic start generated code]*/
1531
1532 static PyObject *
select_epoll_poll_impl(pyEpoll_Object * self,PyObject * timeout_obj,int maxevents)1533 select_epoll_poll_impl(pyEpoll_Object *self, PyObject *timeout_obj,
1534 int maxevents)
1535 /*[clinic end generated code: output=e02d121a20246c6c input=33d34a5ea430fd5b]*/
1536 {
1537 int nfds, i;
1538 PyObject *elist = NULL, *etuple = NULL;
1539 struct epoll_event *evs = NULL;
1540 _PyTime_t timeout = -1, ms = -1, deadline = 0;
1541
1542 if (self->epfd < 0)
1543 return pyepoll_err_closed();
1544
1545 if (timeout_obj != Py_None) {
1546 /* epoll_wait() has a resolution of 1 millisecond, round towards
1547 infinity to wait at least timeout seconds. */
1548 if (_PyTime_FromSecondsObject(&timeout, timeout_obj,
1549 _PyTime_ROUND_TIMEOUT) < 0) {
1550 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
1551 PyErr_SetString(PyExc_TypeError,
1552 "timeout must be an integer or None");
1553 }
1554 return NULL;
1555 }
1556
1557 ms = _PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING);
1558 if (ms < INT_MIN || ms > INT_MAX) {
1559 PyErr_SetString(PyExc_OverflowError, "timeout is too large");
1560 return NULL;
1561 }
1562 /* epoll_wait(2) treats all arbitrary negative numbers the same
1563 for the timeout argument, but -1 is the documented way to block
1564 indefinitely in the epoll_wait(2) documentation, so we set ms
1565 to -1 if the value of ms is a negative number.
1566
1567 Note that we didn't use INFTIM here since it's non-standard and
1568 isn't available under Linux. */
1569 if (ms < 0) {
1570 ms = -1;
1571 }
1572
1573 if (timeout >= 0) {
1574 deadline = _PyDeadline_Init(timeout);
1575 }
1576 }
1577
1578 if (maxevents == -1) {
1579 maxevents = FD_SETSIZE-1;
1580 }
1581 else if (maxevents < 1) {
1582 PyErr_Format(PyExc_ValueError,
1583 "maxevents must be greater than 0, got %d",
1584 maxevents);
1585 return NULL;
1586 }
1587
1588 evs = PyMem_New(struct epoll_event, maxevents);
1589 if (evs == NULL) {
1590 PyErr_NoMemory();
1591 return NULL;
1592 }
1593
1594 do {
1595 Py_BEGIN_ALLOW_THREADS
1596 errno = 0;
1597 nfds = epoll_wait(self->epfd, evs, maxevents, (int)ms);
1598 Py_END_ALLOW_THREADS
1599
1600 if (errno != EINTR)
1601 break;
1602
1603 /* poll() was interrupted by a signal */
1604 if (PyErr_CheckSignals())
1605 goto error;
1606
1607 if (timeout >= 0) {
1608 timeout = _PyDeadline_Get(deadline);
1609 if (timeout < 0) {
1610 nfds = 0;
1611 break;
1612 }
1613 ms = _PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING);
1614 /* retry epoll_wait() with the recomputed timeout */
1615 }
1616 } while(1);
1617
1618 if (nfds < 0) {
1619 PyErr_SetFromErrno(PyExc_OSError);
1620 goto error;
1621 }
1622
1623 elist = PyList_New(nfds);
1624 if (elist == NULL) {
1625 goto error;
1626 }
1627
1628 for (i = 0; i < nfds; i++) {
1629 etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events);
1630 if (etuple == NULL) {
1631 Py_CLEAR(elist);
1632 goto error;
1633 }
1634 PyList_SET_ITEM(elist, i, etuple);
1635 }
1636
1637 error:
1638 PyMem_Free(evs);
1639 return elist;
1640 }
1641
1642
1643 /*[clinic input]
1644 select.epoll.__enter__
1645
1646 [clinic start generated code]*/
1647
1648 static PyObject *
select_epoll___enter___impl(pyEpoll_Object * self)1649 select_epoll___enter___impl(pyEpoll_Object *self)
1650 /*[clinic end generated code: output=ab45d433504db2a0 input=3c22568587efeadb]*/
1651 {
1652 if (self->epfd < 0)
1653 return pyepoll_err_closed();
1654
1655 Py_INCREF(self);
1656 return (PyObject *)self;
1657 }
1658
1659 /*[clinic input]
1660 select.epoll.__exit__
1661
1662 exc_type: object = None
1663 exc_value: object = None
1664 exc_tb: object = None
1665 /
1666
1667 [clinic start generated code]*/
1668
1669 static PyObject *
select_epoll___exit___impl(pyEpoll_Object * self,PyObject * exc_type,PyObject * exc_value,PyObject * exc_tb)1670 select_epoll___exit___impl(pyEpoll_Object *self, PyObject *exc_type,
1671 PyObject *exc_value, PyObject *exc_tb)
1672 /*[clinic end generated code: output=c480f38ce361748e input=7ae81a5a4c1a98d8]*/
1673 {
1674 _selectstate *state = _selectstate_by_type(Py_TYPE(self));
1675 return PyObject_CallMethodObjArgs((PyObject *)self, state->close, NULL);
1676 }
1677
1678 static PyGetSetDef pyepoll_getsetlist[] = {
1679 {"closed", (getter)pyepoll_get_closed, NULL,
1680 "True if the epoll handler is closed"},
1681 {0},
1682 };
1683
1684 PyDoc_STRVAR(pyepoll_doc,
1685 "select.epoll(sizehint=-1, flags=0)\n\
1686 \n\
1687 Returns an epolling object\n\
1688 \n\
1689 sizehint must be a positive integer or -1 for the default size. The\n\
1690 sizehint is used to optimize internal data structures. It doesn't limit\n\
1691 the maximum number of monitored events.");
1692
1693 #endif /* HAVE_EPOLL */
1694
1695 #ifdef HAVE_KQUEUE
1696 /* **************************************************************************
1697 * kqueue interface for BSD
1698 *
1699 * Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
1700 * All rights reserved.
1701 *
1702 * Redistribution and use in source and binary forms, with or without
1703 * modification, are permitted provided that the following conditions
1704 * are met:
1705 * 1. Redistributions of source code must retain the above copyright
1706 * notice, this list of conditions and the following disclaimer.
1707 * 2. Redistributions in binary form must reproduce the above copyright
1708 * notice, this list of conditions and the following disclaimer in the
1709 * documentation and/or other materials provided with the distribution.
1710 *
1711 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1712 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1713 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1714 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1715 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1716 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1717 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1718 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1719 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1720 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1721 * SUCH DAMAGE.
1722 */
1723
1724 #ifdef HAVE_SYS_EVENT_H
1725 #include <sys/event.h>
1726 #endif
1727
1728 PyDoc_STRVAR(kqueue_event_doc,
1729 "kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)\n\
1730 \n\
1731 This object is the equivalent of the struct kevent for the C API.\n\
1732 \n\
1733 See the kqueue manpage for more detailed information about the meaning\n\
1734 of the arguments.\n\
1735 \n\
1736 One minor note: while you might hope that udata could store a\n\
1737 reference to a python object, it cannot, because it is impossible to\n\
1738 keep a proper reference count of the object once it's passed into the\n\
1739 kernel. Therefore, I have restricted it to only storing an integer. I\n\
1740 recommend ignoring it and simply using the 'ident' field to key off\n\
1741 of. You could also set up a dictionary on the python side to store a\n\
1742 udata->object mapping.");
1743
1744 typedef struct {
1745 PyObject_HEAD
1746 struct kevent e;
1747 } kqueue_event_Object;
1748
1749 #define kqueue_event_Check(op, state) (PyObject_TypeCheck((op), state->kqueue_event_Type))
1750
1751 typedef struct {
1752 PyObject_HEAD
1753 SOCKET kqfd; /* kqueue control fd */
1754 } kqueue_queue_Object;
1755
1756 #if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P)
1757 # error uintptr_t does not match void *!
1758 #elif (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG)
1759 # define T_UINTPTRT T_ULONGLONG
1760 # define T_INTPTRT T_LONGLONG
1761 # define UINTPTRT_FMT_UNIT "K"
1762 # define INTPTRT_FMT_UNIT "L"
1763 #elif (SIZEOF_UINTPTR_T == SIZEOF_LONG)
1764 # define T_UINTPTRT T_ULONG
1765 # define T_INTPTRT T_LONG
1766 # define UINTPTRT_FMT_UNIT "k"
1767 # define INTPTRT_FMT_UNIT "l"
1768 #elif (SIZEOF_UINTPTR_T == SIZEOF_INT)
1769 # define T_UINTPTRT T_UINT
1770 # define T_INTPTRT T_INT
1771 # define UINTPTRT_FMT_UNIT "I"
1772 # define INTPTRT_FMT_UNIT "i"
1773 #else
1774 # error uintptr_t does not match int, long, or long long!
1775 #endif
1776
1777 #if SIZEOF_LONG_LONG == 8
1778 # define T_INT64 T_LONGLONG
1779 # define INT64_FMT_UNIT "L"
1780 #elif SIZEOF_LONG == 8
1781 # define T_INT64 T_LONG
1782 # define INT64_FMT_UNIT "l"
1783 #elif SIZEOF_INT == 8
1784 # define T_INT64 T_INT
1785 # define INT64_FMT_UNIT "i"
1786 #else
1787 # define INT64_FMT_UNIT "_"
1788 #endif
1789
1790 #if SIZEOF_LONG_LONG == 4
1791 # define T_UINT32 T_ULONGLONG
1792 # define UINT32_FMT_UNIT "K"
1793 #elif SIZEOF_LONG == 4
1794 # define T_UINT32 T_ULONG
1795 # define UINT32_FMT_UNIT "k"
1796 #elif SIZEOF_INT == 4
1797 # define T_UINT32 T_UINT
1798 # define UINT32_FMT_UNIT "I"
1799 #else
1800 # define UINT32_FMT_UNIT "_"
1801 #endif
1802
1803 /*
1804 * kevent is not standard and its members vary across BSDs.
1805 */
1806 #ifdef __NetBSD__
1807 # define FILTER_TYPE T_UINT32
1808 # define FILTER_FMT_UNIT UINT32_FMT_UNIT
1809 # define FLAGS_TYPE T_UINT32
1810 # define FLAGS_FMT_UNIT UINT32_FMT_UNIT
1811 # define FFLAGS_TYPE T_UINT32
1812 # define FFLAGS_FMT_UNIT UINT32_FMT_UNIT
1813 #else
1814 # define FILTER_TYPE T_SHORT
1815 # define FILTER_FMT_UNIT "h"
1816 # define FLAGS_TYPE T_USHORT
1817 # define FLAGS_FMT_UNIT "H"
1818 # define FFLAGS_TYPE T_UINT
1819 # define FFLAGS_FMT_UNIT "I"
1820 #endif
1821
1822 #if defined(__NetBSD__) || defined(__OpenBSD__)
1823 # define DATA_TYPE T_INT64
1824 # define DATA_FMT_UNIT INT64_FMT_UNIT
1825 #else
1826 # define DATA_TYPE T_INTPTRT
1827 # define DATA_FMT_UNIT INTPTRT_FMT_UNIT
1828 #endif
1829
1830 /* Unfortunately, we can't store python objects in udata, because
1831 * kevents in the kernel can be removed without warning, which would
1832 * forever lose the refcount on the object stored with it.
1833 */
1834
1835 #define KQ_OFF(x) offsetof(kqueue_event_Object, x)
1836 static struct PyMemberDef kqueue_event_members[] = {
1837 {"ident", T_UINTPTRT, KQ_OFF(e.ident)},
1838 {"filter", FILTER_TYPE, KQ_OFF(e.filter)},
1839 {"flags", FLAGS_TYPE, KQ_OFF(e.flags)},
1840 {"fflags", T_UINT, KQ_OFF(e.fflags)},
1841 {"data", DATA_TYPE, KQ_OFF(e.data)},
1842 {"udata", T_UINTPTRT, KQ_OFF(e.udata)},
1843 {NULL} /* Sentinel */
1844 };
1845 #undef KQ_OFF
1846
1847 static PyObject *
1848
kqueue_event_repr(kqueue_event_Object * s)1849 kqueue_event_repr(kqueue_event_Object *s)
1850 {
1851 char buf[1024];
1852 PyOS_snprintf(
1853 buf, sizeof(buf),
1854 "<select.kevent ident=%zu filter=%d flags=0x%x fflags=0x%x "
1855 "data=0x%llx udata=%p>",
1856 (size_t)(s->e.ident), (int)s->e.filter, (unsigned int)s->e.flags,
1857 (unsigned int)s->e.fflags, (long long)(s->e.data), (void *)s->e.udata);
1858 return PyUnicode_FromString(buf);
1859 }
1860
1861 static int
kqueue_event_init(kqueue_event_Object * self,PyObject * args,PyObject * kwds)1862 kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds)
1863 {
1864 PyObject *pfd;
1865 static char *kwlist[] = {"ident", "filter", "flags", "fflags",
1866 "data", "udata", NULL};
1867 static const char fmt[] = "O|"
1868 FILTER_FMT_UNIT FLAGS_FMT_UNIT FFLAGS_FMT_UNIT DATA_FMT_UNIT
1869 UINTPTRT_FMT_UNIT ":kevent";
1870
1871 EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
1872
1873 if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist,
1874 &pfd, &(self->e.filter), &(self->e.flags),
1875 &(self->e.fflags), &(self->e.data), &(self->e.udata))) {
1876 return -1;
1877 }
1878
1879 if (PyLong_Check(pfd)) {
1880 self->e.ident = PyLong_AsSize_t(pfd);
1881 }
1882 else {
1883 self->e.ident = PyObject_AsFileDescriptor(pfd);
1884 }
1885 if (PyErr_Occurred()) {
1886 return -1;
1887 }
1888 return 0;
1889 }
1890
1891 static PyObject *
kqueue_event_richcompare(kqueue_event_Object * s,kqueue_event_Object * o,int op)1892 kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
1893 int op)
1894 {
1895 int result;
1896 _selectstate *state = _selectstate_by_type(Py_TYPE(s));
1897
1898 if (!kqueue_event_Check(o, state)) {
1899 Py_RETURN_NOTIMPLEMENTED;
1900 }
1901
1902 #define CMP(a, b) ((a) != (b)) ? ((a) < (b) ? -1 : 1)
1903 result = CMP(s->e.ident, o->e.ident)
1904 : CMP(s->e.filter, o->e.filter)
1905 : CMP(s->e.flags, o->e.flags)
1906 : CMP(s->e.fflags, o->e.fflags)
1907 : CMP(s->e.data, o->e.data)
1908 : CMP((intptr_t)s->e.udata, (intptr_t)o->e.udata)
1909 : 0;
1910 #undef CMP
1911
1912 Py_RETURN_RICHCOMPARE(result, 0, op);
1913 }
1914
1915 static PyType_Slot kqueue_event_Type_slots[] = {
1916 {Py_tp_doc, (void*)kqueue_event_doc},
1917 {Py_tp_init, kqueue_event_init},
1918 {Py_tp_members, kqueue_event_members},
1919 {Py_tp_new, PyType_GenericNew},
1920 {Py_tp_repr, kqueue_event_repr},
1921 {Py_tp_richcompare, kqueue_event_richcompare},
1922 {0, 0},
1923 };
1924
1925 static PyType_Spec kqueue_event_Type_spec = {
1926 "select.kevent",
1927 sizeof(kqueue_event_Object),
1928 0,
1929 Py_TPFLAGS_DEFAULT,
1930 kqueue_event_Type_slots
1931 };
1932
1933 static PyObject *
kqueue_queue_err_closed(void)1934 kqueue_queue_err_closed(void)
1935 {
1936 PyErr_SetString(PyExc_ValueError, "I/O operation on closed kqueue object");
1937 return NULL;
1938 }
1939
1940 static int
kqueue_queue_internal_close(kqueue_queue_Object * self)1941 kqueue_queue_internal_close(kqueue_queue_Object *self)
1942 {
1943 int save_errno = 0;
1944 if (self->kqfd >= 0) {
1945 int kqfd = self->kqfd;
1946 self->kqfd = -1;
1947 Py_BEGIN_ALLOW_THREADS
1948 if (close(kqfd) < 0)
1949 save_errno = errno;
1950 Py_END_ALLOW_THREADS
1951 }
1952 return save_errno;
1953 }
1954
1955 static PyObject *
newKqueue_Object(PyTypeObject * type,SOCKET fd)1956 newKqueue_Object(PyTypeObject *type, SOCKET fd)
1957 {
1958 kqueue_queue_Object *self;
1959 assert(type != NULL);
1960 allocfunc queue_alloc = PyType_GetSlot(type, Py_tp_alloc);
1961 assert(queue_alloc != NULL);
1962 self = (kqueue_queue_Object *) queue_alloc(type, 0);
1963 if (self == NULL) {
1964 return NULL;
1965 }
1966
1967 if (fd == -1) {
1968 Py_BEGIN_ALLOW_THREADS
1969 self->kqfd = kqueue();
1970 Py_END_ALLOW_THREADS
1971 }
1972 else {
1973 self->kqfd = fd;
1974 }
1975 if (self->kqfd < 0) {
1976 Py_DECREF(self);
1977 PyErr_SetFromErrno(PyExc_OSError);
1978 return NULL;
1979 }
1980
1981 if (fd == -1) {
1982 if (_Py_set_inheritable(self->kqfd, 0, NULL) < 0) {
1983 Py_DECREF(self);
1984 return NULL;
1985 }
1986 }
1987 return (PyObject *)self;
1988 }
1989
1990 /*[clinic input]
1991 @classmethod
1992 select.kqueue.__new__
1993
1994 Kqueue syscall wrapper.
1995
1996 For example, to start watching a socket for input:
1997 >>> kq = kqueue()
1998 >>> sock = socket()
1999 >>> sock.connect((host, port))
2000 >>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_ADD)], 0)
2001
2002 To wait one second for it to become writeable:
2003 >>> kq.control(None, 1, 1000)
2004
2005 To stop listening:
2006 >>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_DELETE)], 0)
2007 [clinic start generated code]*/
2008
2009 static PyObject *
select_kqueue_impl(PyTypeObject * type)2010 select_kqueue_impl(PyTypeObject *type)
2011 /*[clinic end generated code: output=e0ff89f154d56236 input=cf625e49218366e8]*/
2012 {
2013 return newKqueue_Object(type, -1);
2014 }
2015
2016 static void
kqueue_queue_dealloc(kqueue_queue_Object * self)2017 kqueue_queue_dealloc(kqueue_queue_Object *self)
2018 {
2019 PyTypeObject* type = Py_TYPE(self);
2020 kqueue_queue_internal_close(self);
2021 freefunc kqueue_free = PyType_GetSlot(type, Py_tp_free);
2022 kqueue_free((PyObject *)self);
2023 Py_DECREF((PyObject *)type);
2024 }
2025
2026 /*[clinic input]
2027 select.kqueue.close
2028
2029 Close the kqueue control file descriptor.
2030
2031 Further operations on the kqueue object will raise an exception.
2032 [clinic start generated code]*/
2033
2034 static PyObject *
select_kqueue_close_impl(kqueue_queue_Object * self)2035 select_kqueue_close_impl(kqueue_queue_Object *self)
2036 /*[clinic end generated code: output=d1c7df0b407a4bc1 input=0b12d95430e0634c]*/
2037 {
2038 errno = kqueue_queue_internal_close(self);
2039 if (errno < 0) {
2040 PyErr_SetFromErrno(PyExc_OSError);
2041 return NULL;
2042 }
2043 Py_RETURN_NONE;
2044 }
2045
2046 static PyObject*
kqueue_queue_get_closed(kqueue_queue_Object * self,void * Py_UNUSED (ignored))2047 kqueue_queue_get_closed(kqueue_queue_Object *self, void *Py_UNUSED(ignored))
2048 {
2049 if (self->kqfd < 0)
2050 Py_RETURN_TRUE;
2051 else
2052 Py_RETURN_FALSE;
2053 }
2054
2055 /*[clinic input]
2056 select.kqueue.fileno
2057
2058 Return the kqueue control file descriptor.
2059 [clinic start generated code]*/
2060
2061 static PyObject *
select_kqueue_fileno_impl(kqueue_queue_Object * self)2062 select_kqueue_fileno_impl(kqueue_queue_Object *self)
2063 /*[clinic end generated code: output=716f46112a4f6e5c input=41911c539ca2b0ca]*/
2064 {
2065 if (self->kqfd < 0)
2066 return kqueue_queue_err_closed();
2067 return PyLong_FromLong(self->kqfd);
2068 }
2069
2070 /*[clinic input]
2071 @classmethod
2072 select.kqueue.fromfd
2073
2074 fd: int
2075 /
2076
2077 Create a kqueue object from a given control fd.
2078 [clinic start generated code]*/
2079
2080 static PyObject *
select_kqueue_fromfd_impl(PyTypeObject * type,int fd)2081 select_kqueue_fromfd_impl(PyTypeObject *type, int fd)
2082 /*[clinic end generated code: output=d02c3c7dc538a653 input=f6172a48ca4ecdd0]*/
2083 {
2084 SOCKET s_fd = (SOCKET)fd;
2085
2086 return newKqueue_Object(type, s_fd);
2087 }
2088
2089 /*[clinic input]
2090 select.kqueue.control
2091
2092 changelist: object
2093 Must be an iterable of kevent objects describing the changes to be made
2094 to the kernel's watch list or None.
2095 maxevents: int
2096 The maximum number of events that the kernel will return.
2097 timeout as otimeout: object = None
2098 The maximum time to wait in seconds, or else None to wait forever.
2099 This accepts floats for smaller timeouts, too.
2100 /
2101
2102 Calls the kernel kevent function.
2103 [clinic start generated code]*/
2104
2105 static PyObject *
select_kqueue_control_impl(kqueue_queue_Object * self,PyObject * changelist,int maxevents,PyObject * otimeout)2106 select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist,
2107 int maxevents, PyObject *otimeout)
2108 /*[clinic end generated code: output=81324ff5130db7ae input=59c4e30811209c47]*/
2109 {
2110 int gotevents = 0;
2111 int nchanges = 0;
2112 int i = 0;
2113 PyObject *seq = NULL, *ei = NULL;
2114 PyObject *result = NULL;
2115 struct kevent *evl = NULL;
2116 struct kevent *chl = NULL;
2117 struct timespec timeoutspec;
2118 struct timespec *ptimeoutspec;
2119 _PyTime_t timeout, deadline = 0;
2120 _selectstate *state = _selectstate_by_type(Py_TYPE(self));
2121
2122 if (self->kqfd < 0)
2123 return kqueue_queue_err_closed();
2124
2125 if (maxevents < 0) {
2126 PyErr_Format(PyExc_ValueError,
2127 "Length of eventlist must be 0 or positive, got %d",
2128 maxevents);
2129 return NULL;
2130 }
2131
2132 if (otimeout == Py_None) {
2133 ptimeoutspec = NULL;
2134 }
2135 else {
2136 if (_PyTime_FromSecondsObject(&timeout,
2137 otimeout, _PyTime_ROUND_TIMEOUT) < 0) {
2138 PyErr_Format(PyExc_TypeError,
2139 "timeout argument must be a number "
2140 "or None, got %.200s",
2141 _PyType_Name(Py_TYPE(otimeout)));
2142 return NULL;
2143 }
2144
2145 if (_PyTime_AsTimespec(timeout, &timeoutspec) == -1)
2146 return NULL;
2147
2148 if (timeoutspec.tv_sec < 0) {
2149 PyErr_SetString(PyExc_ValueError,
2150 "timeout must be positive or None");
2151 return NULL;
2152 }
2153 ptimeoutspec = &timeoutspec;
2154 }
2155
2156 if (changelist != Py_None) {
2157 seq = PySequence_Fast(changelist, "changelist is not iterable");
2158 if (seq == NULL) {
2159 return NULL;
2160 }
2161 if (PySequence_Fast_GET_SIZE(seq) > INT_MAX) {
2162 PyErr_SetString(PyExc_OverflowError,
2163 "changelist is too long");
2164 goto error;
2165 }
2166 nchanges = (int)PySequence_Fast_GET_SIZE(seq);
2167
2168 chl = PyMem_New(struct kevent, nchanges);
2169 if (chl == NULL) {
2170 PyErr_NoMemory();
2171 goto error;
2172 }
2173 _selectstate *state = _selectstate_by_type(Py_TYPE(self));
2174 for (i = 0; i < nchanges; ++i) {
2175 ei = PySequence_Fast_GET_ITEM(seq, i);
2176 if (!kqueue_event_Check(ei, state)) {
2177 PyErr_SetString(PyExc_TypeError,
2178 "changelist must be an iterable of "
2179 "select.kevent objects");
2180 goto error;
2181 }
2182 chl[i] = ((kqueue_event_Object *)ei)->e;
2183 }
2184 Py_CLEAR(seq);
2185 }
2186
2187 /* event list */
2188 if (maxevents) {
2189 evl = PyMem_New(struct kevent, maxevents);
2190 if (evl == NULL) {
2191 PyErr_NoMemory();
2192 goto error;
2193 }
2194 }
2195
2196 if (ptimeoutspec) {
2197 deadline = _PyDeadline_Init(timeout);
2198 }
2199
2200 do {
2201 Py_BEGIN_ALLOW_THREADS
2202 errno = 0;
2203 gotevents = kevent(self->kqfd, chl, nchanges,
2204 evl, maxevents, ptimeoutspec);
2205 Py_END_ALLOW_THREADS
2206
2207 if (errno != EINTR)
2208 break;
2209
2210 /* kevent() was interrupted by a signal */
2211 if (PyErr_CheckSignals())
2212 goto error;
2213
2214 if (ptimeoutspec) {
2215 timeout = _PyDeadline_Get(deadline);
2216 if (timeout < 0) {
2217 gotevents = 0;
2218 break;
2219 }
2220 if (_PyTime_AsTimespec(timeout, &timeoutspec) == -1)
2221 goto error;
2222 /* retry kevent() with the recomputed timeout */
2223 }
2224 } while (1);
2225
2226 if (gotevents == -1) {
2227 PyErr_SetFromErrno(PyExc_OSError);
2228 goto error;
2229 }
2230
2231 result = PyList_New(gotevents);
2232 if (result == NULL) {
2233 goto error;
2234 }
2235
2236 for (i = 0; i < gotevents; i++) {
2237 kqueue_event_Object *ch;
2238
2239 ch = PyObject_New(kqueue_event_Object, state->kqueue_event_Type);
2240 if (ch == NULL) {
2241 goto error;
2242 }
2243 ch->e = evl[i];
2244 PyList_SET_ITEM(result, i, (PyObject *)ch);
2245 }
2246 PyMem_Free(chl);
2247 PyMem_Free(evl);
2248 return result;
2249
2250 error:
2251 PyMem_Free(chl);
2252 PyMem_Free(evl);
2253 Py_XDECREF(result);
2254 Py_XDECREF(seq);
2255 return NULL;
2256 }
2257
2258 static PyGetSetDef kqueue_queue_getsetlist[] = {
2259 {"closed", (getter)kqueue_queue_get_closed, NULL,
2260 "True if the kqueue handler is closed"},
2261 {0},
2262 };
2263
2264 #endif /* HAVE_KQUEUE */
2265
2266
2267 /* ************************************************************************ */
2268
2269 #include "clinic/selectmodule.c.h"
2270
2271 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
2272
2273 static PyMethodDef poll_methods[] = {
2274 SELECT_POLL_REGISTER_METHODDEF
2275 SELECT_POLL_MODIFY_METHODDEF
2276 SELECT_POLL_UNREGISTER_METHODDEF
2277 SELECT_POLL_POLL_METHODDEF
2278 {NULL, NULL} /* sentinel */
2279 };
2280
2281
2282 static PyType_Slot poll_Type_slots[] = {
2283 {Py_tp_dealloc, poll_dealloc},
2284 {Py_tp_methods, poll_methods},
2285 {0, 0},
2286 };
2287
2288 static PyType_Spec poll_Type_spec = {
2289 .name = "select.poll",
2290 .basicsize = sizeof(pollObject),
2291 .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
2292 .slots = poll_Type_slots,
2293 };
2294
2295 #ifdef HAVE_SYS_DEVPOLL_H
2296
2297 static PyMethodDef devpoll_methods[] = {
2298 SELECT_DEVPOLL_REGISTER_METHODDEF
2299 SELECT_DEVPOLL_MODIFY_METHODDEF
2300 SELECT_DEVPOLL_UNREGISTER_METHODDEF
2301 SELECT_DEVPOLL_POLL_METHODDEF
2302 SELECT_DEVPOLL_CLOSE_METHODDEF
2303 SELECT_DEVPOLL_FILENO_METHODDEF
2304 {NULL, NULL} /* sentinel */
2305 };
2306
2307 #endif /* HAVE_SYS_DEVPOLL_H */
2308
2309 #endif /* HAVE_POLL */
2310
2311 #ifdef HAVE_EPOLL
2312
2313 static PyMethodDef pyepoll_methods[] = {
2314 SELECT_EPOLL_FROMFD_METHODDEF
2315 SELECT_EPOLL_CLOSE_METHODDEF
2316 SELECT_EPOLL_FILENO_METHODDEF
2317 SELECT_EPOLL_MODIFY_METHODDEF
2318 SELECT_EPOLL_REGISTER_METHODDEF
2319 SELECT_EPOLL_UNREGISTER_METHODDEF
2320 SELECT_EPOLL_POLL_METHODDEF
2321 SELECT_EPOLL___ENTER___METHODDEF
2322 SELECT_EPOLL___EXIT___METHODDEF
2323 {NULL, NULL},
2324 };
2325
2326 static PyType_Slot pyEpoll_Type_slots[] = {
2327 {Py_tp_dealloc, pyepoll_dealloc},
2328 {Py_tp_doc, (void*)pyepoll_doc},
2329 {Py_tp_getattro, PyObject_GenericGetAttr},
2330 {Py_tp_getset, pyepoll_getsetlist},
2331 {Py_tp_methods, pyepoll_methods},
2332 {Py_tp_new, select_epoll},
2333 {0, 0},
2334 };
2335
2336 static PyType_Spec pyEpoll_Type_spec = {
2337 "select.epoll",
2338 sizeof(pyEpoll_Object),
2339 0,
2340 Py_TPFLAGS_DEFAULT,
2341 pyEpoll_Type_slots
2342 };
2343
2344 #endif /* HAVE_EPOLL */
2345
2346 #ifdef HAVE_KQUEUE
2347
2348 static PyMethodDef kqueue_queue_methods[] = {
2349 SELECT_KQUEUE_FROMFD_METHODDEF
2350 SELECT_KQUEUE_CLOSE_METHODDEF
2351 SELECT_KQUEUE_FILENO_METHODDEF
2352 SELECT_KQUEUE_CONTROL_METHODDEF
2353 {NULL, NULL},
2354 };
2355
2356 static PyType_Slot kqueue_queue_Type_slots[] = {
2357 {Py_tp_dealloc, kqueue_queue_dealloc},
2358 {Py_tp_doc, (void*)select_kqueue__doc__},
2359 {Py_tp_getset, kqueue_queue_getsetlist},
2360 {Py_tp_methods, kqueue_queue_methods},
2361 {Py_tp_new, select_kqueue},
2362 {0, 0},
2363 };
2364
2365 static PyType_Spec kqueue_queue_Type_spec = {
2366 "select.kqueue",
2367 sizeof(kqueue_queue_Object),
2368 0,
2369 Py_TPFLAGS_DEFAULT,
2370 kqueue_queue_Type_slots
2371 };
2372
2373 #endif /* HAVE_KQUEUE */
2374
2375
2376
2377
2378
2379 /* ************************************************************************ */
2380
2381
2382 static PyMethodDef select_methods[] = {
2383 SELECT_SELECT_METHODDEF
2384 SELECT_POLL_METHODDEF
2385 SELECT_DEVPOLL_METHODDEF
2386 {0, 0}, /* sentinel */
2387 };
2388
2389 PyDoc_STRVAR(module_doc,
2390 "This module supports asynchronous I/O on multiple file descriptors.\n\
2391 \n\
2392 *** IMPORTANT NOTICE ***\n\
2393 On Windows, only sockets are supported; on Unix, all file descriptors.");
2394
2395
2396
2397 static int
_select_traverse(PyObject * module,visitproc visit,void * arg)2398 _select_traverse(PyObject *module, visitproc visit, void *arg)
2399 {
2400 _selectstate *state = get_select_state(module);
2401
2402 Py_VISIT(state->close);
2403 Py_VISIT(state->poll_Type);
2404 Py_VISIT(state->devpoll_Type);
2405 Py_VISIT(state->pyEpoll_Type);
2406 Py_VISIT(state->kqueue_event_Type);
2407 Py_VISIT(state->kqueue_queue_Type);
2408 return 0;
2409 }
2410
2411 static int
_select_clear(PyObject * module)2412 _select_clear(PyObject *module)
2413 {
2414 _selectstate *state = get_select_state(module);
2415
2416 Py_CLEAR(state->close);
2417 Py_CLEAR(state->poll_Type);
2418 Py_CLEAR(state->devpoll_Type);
2419 Py_CLEAR(state->pyEpoll_Type);
2420 Py_CLEAR(state->kqueue_event_Type);
2421 Py_CLEAR(state->kqueue_queue_Type);
2422 return 0;
2423 }
2424
2425 static void
_select_free(void * module)2426 _select_free(void *module)
2427 {
2428 _select_clear((PyObject *)module);
2429 }
2430
2431 int
_select_exec(PyObject * m)2432 _select_exec(PyObject *m)
2433 {
2434 _selectstate *state = get_select_state(m);
2435
2436 state->close = PyUnicode_InternFromString("close");
2437 if (state->close == NULL) {
2438 return -1;
2439 }
2440 if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) {
2441 return -1;
2442 }
2443
2444 #ifdef PIPE_BUF
2445 #ifdef HAVE_BROKEN_PIPE_BUF
2446 #undef PIPE_BUF
2447 #define PIPE_BUF 512
2448 #endif
2449 PyModule_AddIntMacro(m, PIPE_BUF);
2450 #endif
2451
2452 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
2453 #ifdef __APPLE__
2454 if (select_have_broken_poll()) {
2455 if (PyObject_DelAttrString(m, "poll") == -1) {
2456 PyErr_Clear();
2457 }
2458 } else {
2459 #else
2460 {
2461 #endif
2462 state->poll_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2463 m, &poll_Type_spec, NULL);
2464 if (state->poll_Type == NULL) {
2465 return -1;
2466 }
2467
2468 PyModule_AddIntMacro(m, POLLIN);
2469 PyModule_AddIntMacro(m, POLLPRI);
2470 PyModule_AddIntMacro(m, POLLOUT);
2471 PyModule_AddIntMacro(m, POLLERR);
2472 PyModule_AddIntMacro(m, POLLHUP);
2473 PyModule_AddIntMacro(m, POLLNVAL);
2474
2475 #ifdef POLLRDNORM
2476 PyModule_AddIntMacro(m, POLLRDNORM);
2477 #endif
2478 #ifdef POLLRDBAND
2479 PyModule_AddIntMacro(m, POLLRDBAND);
2480 #endif
2481 #ifdef POLLWRNORM
2482 PyModule_AddIntMacro(m, POLLWRNORM);
2483 #endif
2484 #ifdef POLLWRBAND
2485 PyModule_AddIntMacro(m, POLLWRBAND);
2486 #endif
2487 #ifdef POLLMSG
2488 PyModule_AddIntMacro(m, POLLMSG);
2489 #endif
2490 #ifdef POLLRDHUP
2491 /* Kernel 2.6.17+ */
2492 PyModule_AddIntMacro(m, POLLRDHUP);
2493 #endif
2494 }
2495 #endif /* HAVE_POLL */
2496
2497 #ifdef HAVE_SYS_DEVPOLL_H
2498 state->devpoll_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2499 m, &devpoll_Type_spec, NULL);
2500 if (state->devpoll_Type == NULL) {
2501 return -1;
2502 }
2503 #endif
2504
2505 #ifdef HAVE_EPOLL
2506 state->pyEpoll_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2507 m, &pyEpoll_Type_spec, NULL);
2508 if (state->pyEpoll_Type == NULL) {
2509 return -1;
2510 }
2511 if (PyModule_AddType(m, state->pyEpoll_Type) < 0) {
2512 return -1;
2513 }
2514
2515 PyModule_AddIntMacro(m, EPOLLIN);
2516 PyModule_AddIntMacro(m, EPOLLOUT);
2517 PyModule_AddIntMacro(m, EPOLLPRI);
2518 PyModule_AddIntMacro(m, EPOLLERR);
2519 PyModule_AddIntMacro(m, EPOLLHUP);
2520 #ifdef EPOLLRDHUP
2521 /* Kernel 2.6.17 */
2522 PyModule_AddIntMacro(m, EPOLLRDHUP);
2523 #endif
2524 PyModule_AddIntMacro(m, EPOLLET);
2525 #ifdef EPOLLONESHOT
2526 /* Kernel 2.6.2+ */
2527 PyModule_AddIntMacro(m, EPOLLONESHOT);
2528 #endif
2529 #ifdef EPOLLEXCLUSIVE
2530 PyModule_AddIntMacro(m, EPOLLEXCLUSIVE);
2531 #endif
2532
2533 #ifdef EPOLLRDNORM
2534 PyModule_AddIntMacro(m, EPOLLRDNORM);
2535 #endif
2536 #ifdef EPOLLRDBAND
2537 PyModule_AddIntMacro(m, EPOLLRDBAND);
2538 #endif
2539 #ifdef EPOLLWRNORM
2540 PyModule_AddIntMacro(m, EPOLLWRNORM);
2541 #endif
2542 #ifdef EPOLLWRBAND
2543 PyModule_AddIntMacro(m, EPOLLWRBAND);
2544 #endif
2545 #ifdef EPOLLMSG
2546 PyModule_AddIntMacro(m, EPOLLMSG);
2547 #endif
2548
2549 #ifdef EPOLL_CLOEXEC
2550 PyModule_AddIntMacro(m, EPOLL_CLOEXEC);
2551 #endif
2552 #endif /* HAVE_EPOLL */
2553
2554 #ifdef HAVE_KQUEUE
2555 state->kqueue_event_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2556 m, &kqueue_event_Type_spec, NULL);
2557 if (state->kqueue_event_Type == NULL) {
2558 return -1;
2559 }
2560 if (PyModule_AddType(m, state->kqueue_event_Type) < 0) {
2561 return -1;
2562 }
2563
2564 state->kqueue_queue_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
2565 m, &kqueue_queue_Type_spec, NULL);
2566 if (state->kqueue_queue_Type == NULL) {
2567 return -1;
2568 }
2569 if (PyModule_AddType(m, state->kqueue_queue_Type) < 0) {
2570 return -1;
2571 }
2572
2573 /* event filters */
2574 PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
2575 PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE);
2576 #ifdef EVFILT_AIO
2577 PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO);
2578 #endif
2579 #ifdef EVFILT_VNODE
2580 PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE);
2581 #endif
2582 #ifdef EVFILT_PROC
2583 PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC);
2584 #endif
2585 #ifdef EVFILT_NETDEV
2586 PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV);
2587 #endif
2588 #ifdef EVFILT_SIGNAL
2589 PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
2590 #endif
2591 PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER);
2592
2593 /* event flags */
2594 PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD);
2595 PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE);
2596 PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE);
2597 PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE);
2598 PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT);
2599 PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR);
2600
2601 #ifdef EV_SYSFLAGS
2602 PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS);
2603 #endif
2604 #ifdef EV_FLAG1
2605 PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1);
2606 #endif
2607
2608 PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF);
2609 PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR);
2610
2611 /* READ WRITE filter flag */
2612 #ifdef NOTE_LOWAT
2613 PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT);
2614 #endif
2615
2616 /* VNODE filter flags */
2617 #ifdef EVFILT_VNODE
2618 PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE);
2619 PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE);
2620 PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND);
2621 PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB);
2622 PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK);
2623 PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME);
2624 PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE);
2625 #endif
2626
2627 /* PROC filter flags */
2628 #ifdef EVFILT_PROC
2629 PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT);
2630 PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK);
2631 PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC);
2632 PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
2633 PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
2634
2635 PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK);
2636 PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD);
2637 PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR);
2638 #endif
2639
2640 /* NETDEV filter flags */
2641 #ifdef EVFILT_NETDEV
2642 PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP);
2643 PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
2644 PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV);
2645 #endif
2646
2647 #endif /* HAVE_KQUEUE */
2648 return 0;
2649 }
2650
2651 static PyModuleDef_Slot _select_slots[] = {
2652 {Py_mod_exec, _select_exec},
2653 {0, NULL}
2654 };
2655
2656 static struct PyModuleDef selectmodule = {
2657 PyModuleDef_HEAD_INIT,
2658 .m_name = "select",
2659 .m_doc = module_doc,
2660 .m_size = sizeof(_selectstate),
2661 .m_methods = select_methods,
2662 .m_slots = _select_slots,
2663 .m_traverse = _select_traverse,
2664 .m_clear = _select_clear,
2665 .m_free = _select_free,
2666 };
2667
2668 PyMODINIT_FUNC
2669 PyInit_select(void)
2670 {
2671 return PyModuleDef_Init(&selectmodule);
2672 }
2673