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