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