blob: 12601713886b8c283a73cde5d8d257e7483f9fc6 [file] [log] [blame]
Guido van Rossum4f0fbf81996-06-12 04:22:53 +00001/* select - Module containing unix select(2) call.
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00002 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.
Guido van Rossumbcc20741998-08-04 22:53:56 +00005 Under BeOS, we suffer the same dichotomy as Win32; sockets can be anything
6 >= 0.
Guido van Rossum4f0fbf81996-06-12 04:22:53 +00007*/
Guido van Rossumed233a51992-06-23 09:07:03 +00008
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00009#include "Python.h"
Christian Heimes0e9ab5f2008-03-21 23:49:44 +000010#include <structmember.h>
Guido van Rossumed233a51992-06-23 09:07:03 +000011
Ronald Oussoren32fd16e2006-04-23 12:36:23 +000012#ifdef __APPLE__
13 /* Perform runtime testing for a broken poll on OSX to make it easier
14 * to use the same binary on multiple releases of the OS.
15 */
16#undef HAVE_BROKEN_POLL
17#endif
18
Tim Petersd92dfe02000-12-12 01:18:41 +000019/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
20 64 is too small (too many people have bumped into that limit).
21 Here we boost it.
22 Users who want even more than the boosted limit should #define
23 FD_SETSIZE higher before this; e.g., via compiler /D switch.
24*/
25#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
26#define FD_SETSIZE 512
Antoine Pitrouc83ea132010-05-09 14:46:46 +000027#endif
Tim Petersd92dfe02000-12-12 01:18:41 +000028
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000029#if defined(HAVE_POLL_H)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000030#include <poll.h>
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000031#elif defined(HAVE_SYS_POLL_H)
32#include <sys/poll.h>
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000033#endif
Guido van Rossuma376cc51996-12-05 23:43:35 +000034
Guido van Rossum37273171996-12-09 18:47:43 +000035#ifdef __sgi
36/* This is missing from unistd.h */
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000037extern void bzero(void *, int);
Guido van Rossum37273171996-12-09 18:47:43 +000038#endif
39
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000040#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000041#include <sys/types.h>
Guido van Rossumff7e83d1999-08-27 20:39:37 +000042#endif
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000043
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000044#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000045#include <sys/time.h>
46#include <utils.h>
47#endif
48
Guido van Rossum6f489d91996-06-28 20:15:15 +000049#ifdef MS_WINDOWS
Kristján Valur Jónssonf6f3c4a2010-11-03 13:27:33 +000050# include <winsock2.h>
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000051#else
Neal Norwitz2a30cd02006-07-10 01:18:57 +000052# define SOCKET int
53# ifdef __BEOS__
54# include <net/socket.h>
55# elif defined(__VMS)
56# include <socket.h>
57# endif
Guido van Rossumbcc20741998-08-04 22:53:56 +000058#endif
Guido van Rossumed233a51992-06-23 09:07:03 +000059
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000060static PyObject *SelectError;
Guido van Rossumed233a51992-06-23 09:07:03 +000061
Barry Warsawc1cb3601996-12-12 22:16:21 +000062/* list of Python objects and their file descriptor */
63typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000064 PyObject *obj; /* owned reference */
65 SOCKET fd;
66 int sentinel; /* -1 == sentinel */
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000067} pylist;
68
Barry Warsawc1cb3601996-12-12 22:16:21 +000069static void
Tim Peters4b046c22001-08-16 21:59:46 +000070reap_obj(pylist fd2obj[FD_SETSIZE + 1])
Barry Warsawc1cb3601996-12-12 22:16:21 +000071{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000072 int i;
73 for (i = 0; i < FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) {
Serhiy Storchaka98a97222014-02-09 13:14:04 +020074 Py_CLEAR(fd2obj[i].obj);
Antoine Pitrouc83ea132010-05-09 14:46:46 +000075 }
76 fd2obj[0].sentinel = -1;
Barry Warsawc1cb3601996-12-12 22:16:21 +000077}
78
79
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000080/* returns -1 and sets the Python exception if an error occurred, otherwise
81 returns a number >= 0
82*/
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000083static int
Brett Cannon62dba4c2003-09-10 19:37:42 +000084seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +000085{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000086 int i;
87 int max = -1;
88 int index = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +000089 PyObject* fast_seq = NULL;
90 PyObject* o = NULL;
Guido van Rossum07432c01995-03-29 16:47:45 +000091
Antoine Pitrouc83ea132010-05-09 14:46:46 +000092 fd2obj[0].obj = (PyObject*)0; /* set list to zero size */
93 FD_ZERO(set);
Barry Warsawc1cb3601996-12-12 22:16:21 +000094
Antoine Pitrouc83ea132010-05-09 14:46:46 +000095 fast_seq = PySequence_Fast(seq, "arguments 1-3 must be sequences");
96 if (!fast_seq)
97 return -1;
98
Antoine Pitrou0552fc22012-11-01 20:13:54 +010099 for (i = 0; i < PySequence_Fast_GET_SIZE(fast_seq); i++) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000100 SOCKET v;
101
102 /* any intervening fileno() calls could decr this refcnt */
103 if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i)))
Brett Cannon62dba4c2003-09-10 19:37:42 +0000104 return -1;
105
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000106 Py_INCREF(o);
107 v = PyObject_AsFileDescriptor( o );
108 if (v == -1) goto finally;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000109
Guido van Rossum947a0fa2000-01-14 16:33:09 +0000110#if defined(_MSC_VER)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000111 max = 0; /* not used for Win32 */
Barry Warsawc1cb3601996-12-12 22:16:21 +0000112#else /* !_MSC_VER */
Charles-François Natalifda7b372011-08-28 16:22:33 +0200113 if (!_PyIsSelectable_fd(v)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000114 PyErr_SetString(PyExc_ValueError,
115 "filedescriptor out of range in select()");
116 goto finally;
117 }
118 if (v > max)
119 max = v;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000120#endif /* _MSC_VER */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000121 FD_SET(v, set);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000122
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000123 /* add object and its file descriptor to the list */
124 if (index >= FD_SETSIZE) {
125 PyErr_SetString(PyExc_ValueError,
126 "too many file descriptors in select()");
127 goto finally;
128 }
129 fd2obj[index].obj = o;
130 fd2obj[index].fd = v;
131 fd2obj[index].sentinel = 0;
132 fd2obj[++index].sentinel = -1;
133 }
134 Py_DECREF(fast_seq);
135 return max+1;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000136
137 finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000138 Py_XDECREF(o);
139 Py_DECREF(fast_seq);
140 return -1;
Guido van Rossumed233a51992-06-23 09:07:03 +0000141}
142
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000143/* returns NULL and sets the Python exception if an error occurred */
144static PyObject *
Tim Peters4b046c22001-08-16 21:59:46 +0000145set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +0000146{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000147 int i, j, count=0;
148 PyObject *list, *o;
149 SOCKET fd;
Guido van Rossumed233a51992-06-23 09:07:03 +0000150
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000151 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
152 if (FD_ISSET(fd2obj[j].fd, set))
153 count++;
154 }
155 list = PyList_New(count);
156 if (!list)
157 return NULL;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000158
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000159 i = 0;
160 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
161 fd = fd2obj[j].fd;
162 if (FD_ISSET(fd, set)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000163 o = fd2obj[j].obj;
164 fd2obj[j].obj = NULL;
165 /* transfer ownership */
166 if (PyList_SetItem(list, i, o) < 0)
167 goto finally;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000168
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000169 i++;
170 }
171 }
172 return list;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000173 finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000174 Py_DECREF(list);
175 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000176}
Barry Warsawc1cb3601996-12-12 22:16:21 +0000177
Barry Warsawb44740f2001-08-16 16:52:59 +0000178#undef SELECT_USES_HEAP
179#if FD_SETSIZE > 1024
180#define SELECT_USES_HEAP
181#endif /* FD_SETSIZE > 1024 */
182
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000183static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000184select_select(PyObject *self, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000185{
Barry Warsawb44740f2001-08-16 16:52:59 +0000186#ifdef SELECT_USES_HEAP
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000187 pylist *rfd2obj, *wfd2obj, *efd2obj;
Barry Warsawb44740f2001-08-16 16:52:59 +0000188#else /* !SELECT_USES_HEAP */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000189 /* XXX: All this should probably be implemented as follows:
190 * - find the highest descriptor we're interested in
191 * - add one
192 * - that's the size
193 * See: Stevens, APitUE, $12.5.1
194 */
195 pylist rfd2obj[FD_SETSIZE + 1];
196 pylist wfd2obj[FD_SETSIZE + 1];
197 pylist efd2obj[FD_SETSIZE + 1];
Barry Warsawb44740f2001-08-16 16:52:59 +0000198#endif /* SELECT_USES_HEAP */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000199 PyObject *ifdlist, *ofdlist, *efdlist;
200 PyObject *ret = NULL;
201 PyObject *tout = Py_None;
202 fd_set ifdset, ofdset, efdset;
203 double timeout;
204 struct timeval tv, *tvp;
205 long seconds;
206 int imax, omax, emax, max;
207 int n;
Guido van Rossumed233a51992-06-23 09:07:03 +0000208
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000209 /* convert arguments */
210 if (!PyArg_UnpackTuple(args, "select", 3, 4,
211 &ifdlist, &ofdlist, &efdlist, &tout))
212 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000213
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000214 if (tout == Py_None)
215 tvp = (struct timeval *)0;
216 else if (!PyNumber_Check(tout)) {
217 PyErr_SetString(PyExc_TypeError,
218 "timeout must be a float or None");
219 return NULL;
220 }
221 else {
222 timeout = PyFloat_AsDouble(tout);
223 if (timeout == -1 && PyErr_Occurred())
224 return NULL;
225 if (timeout > (double)LONG_MAX) {
226 PyErr_SetString(PyExc_OverflowError,
227 "timeout period too long");
228 return NULL;
229 }
230 seconds = (long)timeout;
231 timeout = timeout - (double)seconds;
232 tv.tv_sec = seconds;
233 tv.tv_usec = (long)(timeout * 1E6);
234 tvp = &tv;
235 }
Guido van Rossumed233a51992-06-23 09:07:03 +0000236
Guido van Rossumed233a51992-06-23 09:07:03 +0000237
Barry Warsawb44740f2001-08-16 16:52:59 +0000238#ifdef SELECT_USES_HEAP
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000239 /* Allocate memory for the lists */
240 rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
241 wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
242 efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
243 if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
244 if (rfd2obj) PyMem_DEL(rfd2obj);
245 if (wfd2obj) PyMem_DEL(wfd2obj);
246 if (efd2obj) PyMem_DEL(efd2obj);
247 return PyErr_NoMemory();
248 }
Barry Warsawb44740f2001-08-16 16:52:59 +0000249#endif /* SELECT_USES_HEAP */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000250 /* Convert sequences to fd_sets, and get maximum fd number
251 * propagates the Python exception set in seq2set()
252 */
253 rfd2obj[0].sentinel = -1;
254 wfd2obj[0].sentinel = -1;
255 efd2obj[0].sentinel = -1;
256 if ((imax=seq2set(ifdlist, &ifdset, rfd2obj)) < 0)
257 goto finally;
258 if ((omax=seq2set(ofdlist, &ofdset, wfd2obj)) < 0)
259 goto finally;
260 if ((emax=seq2set(efdlist, &efdset, efd2obj)) < 0)
261 goto finally;
262 max = imax;
263 if (omax > max) max = omax;
264 if (emax > max) max = emax;
Guido van Rossumed233a51992-06-23 09:07:03 +0000265
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000266 Py_BEGIN_ALLOW_THREADS
267 n = select(max, &ifdset, &ofdset, &efdset, tvp);
268 Py_END_ALLOW_THREADS
Guido van Rossumed233a51992-06-23 09:07:03 +0000269
Thomas Heller106f4c72002-09-24 16:51:00 +0000270#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000271 if (n == SOCKET_ERROR) {
272 PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError());
273 }
Thomas Heller106f4c72002-09-24 16:51:00 +0000274#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000275 if (n < 0) {
276 PyErr_SetFromErrno(SelectError);
277 }
Thomas Heller106f4c72002-09-24 16:51:00 +0000278#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000279 else {
280 /* any of these three calls can raise an exception. it's more
281 convenient to test for this after all three calls... but
282 is that acceptable?
283 */
284 ifdlist = set2list(&ifdset, rfd2obj);
285 ofdlist = set2list(&ofdset, wfd2obj);
286 efdlist = set2list(&efdset, efd2obj);
287 if (PyErr_Occurred())
288 ret = NULL;
289 else
290 ret = PyTuple_Pack(3, ifdlist, ofdlist, efdlist);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000291
Xiang Zhange6a55dd2017-03-22 12:46:14 +0800292 Py_XDECREF(ifdlist);
293 Py_XDECREF(ofdlist);
294 Py_XDECREF(efdlist);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000295 }
296
Barry Warsawc1cb3601996-12-12 22:16:21 +0000297 finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000298 reap_obj(rfd2obj);
299 reap_obj(wfd2obj);
300 reap_obj(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000301#ifdef SELECT_USES_HEAP
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000302 PyMem_DEL(rfd2obj);
303 PyMem_DEL(wfd2obj);
304 PyMem_DEL(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000305#endif /* SELECT_USES_HEAP */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000306 return ret;
Guido van Rossumed233a51992-06-23 09:07:03 +0000307}
308
Nicholas Bastine62c5c82004-03-21 23:45:42 +0000309#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000310/*
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000311 * poll() support
312 */
313
314typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000315 PyObject_HEAD
316 PyObject *dict;
317 int ufd_uptodate;
318 int ufd_len;
319 struct pollfd *ufds;
Serhiy Storchakac3603892013-08-20 20:38:21 +0300320 int poll_running;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000321} pollObject;
322
Jeremy Hylton938ace62002-07-17 16:30:39 +0000323static PyTypeObject poll_Type;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000324
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000325/* Update the malloc'ed array of pollfds to match the dictionary
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000326 contained within a pollObject. Return 1 on success, 0 on an error.
327*/
328
329static int
330update_ufd_array(pollObject *self)
331{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000332 Py_ssize_t i, pos;
333 PyObject *key, *value;
334 struct pollfd *old_ufds = self->ufds;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000335
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000336 self->ufd_len = PyDict_Size(self->dict);
337 PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len);
338 if (self->ufds == NULL) {
339 self->ufds = old_ufds;
340 PyErr_NoMemory();
341 return 0;
342 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000343
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000344 i = pos = 0;
345 while (PyDict_Next(self->dict, &pos, &key, &value)) {
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200346 assert(i < self->ufd_len);
347 /* Never overflow */
348 self->ufds[i].fd = (int)PyInt_AsLong(key);
Serhiy Storchakaa92cc912013-12-14 19:11:04 +0200349 self->ufds[i].events = (short)(unsigned short)PyInt_AsLong(value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000350 i++;
351 }
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200352 assert(i == self->ufd_len);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000353 self->ufd_uptodate = 1;
354 return 1;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000355}
356
Serhiy Storchakaa92cc912013-12-14 19:11:04 +0200357static int
358ushort_converter(PyObject *obj, void *ptr)
359{
360 unsigned long uval;
361
362 uval = PyLong_AsUnsignedLong(obj);
363 if (uval == (unsigned long)-1 && PyErr_Occurred())
364 return 0;
365 if (uval > USHRT_MAX) {
366 PyErr_SetString(PyExc_OverflowError,
367 "Python int too large for C unsigned short");
368 return 0;
369 }
370
371 *(unsigned short *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned short);
372 return 1;
373}
374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000375PyDoc_STRVAR(poll_register_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000376"register(fd [, eventmask] ) -> None\n\n\
377Register a file descriptor with the polling object.\n\
Barry Warsaw2f704552001-08-16 16:55:10 +0000378fd -- either an integer, or an object with a fileno() method returning an\n\
379 int.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000380events -- an optional bitmask describing the type of events to check for");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000381
382static PyObject *
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000383poll_register(pollObject *self, PyObject *args)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000384{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000385 PyObject *o, *key, *value;
Serhiy Storchakaa92cc912013-12-14 19:11:04 +0200386 int fd;
387 unsigned short events = POLLIN | POLLPRI | POLLOUT;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000388 int err;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000389
Serhiy Storchakaa92cc912013-12-14 19:11:04 +0200390 if (!PyArg_ParseTuple(args, "O|O&:register", &o, ushort_converter, &events))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000391 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000392
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000393 fd = PyObject_AsFileDescriptor(o);
394 if (fd == -1) return NULL;
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000395
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000396 /* Add entry to the internal dictionary: the key is the
397 file descriptor, and the value is the event mask. */
398 key = PyInt_FromLong(fd);
399 if (key == NULL)
400 return NULL;
401 value = PyInt_FromLong(events);
402 if (value == NULL) {
403 Py_DECREF(key);
404 return NULL;
405 }
406 err = PyDict_SetItem(self->dict, key, value);
407 Py_DECREF(key);
408 Py_DECREF(value);
409 if (err < 0)
410 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000411
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000412 self->ufd_uptodate = 0;
413
414 Py_INCREF(Py_None);
415 return Py_None;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000416}
417
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000418PyDoc_STRVAR(poll_modify_doc,
419"modify(fd, eventmask) -> None\n\n\
Andrew M. Kuchlinga8c3f2b2008-03-26 00:16:50 +0000420Modify an already registered file descriptor.\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000421fd -- either an integer, or an object with a fileno() method returning an\n\
422 int.\n\
423events -- an optional bitmask describing the type of events to check for");
424
425static PyObject *
426poll_modify(pollObject *self, PyObject *args)
427{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000428 PyObject *o, *key, *value;
Serhiy Storchakaa92cc912013-12-14 19:11:04 +0200429 int fd;
430 unsigned short events;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000431 int err;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000432
Serhiy Storchakaa92cc912013-12-14 19:11:04 +0200433 if (!PyArg_ParseTuple(args, "OO&:modify", &o, ushort_converter, &events))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000434 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000435
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000436 fd = PyObject_AsFileDescriptor(o);
437 if (fd == -1) return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000438
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000439 /* Modify registered fd */
440 key = PyInt_FromLong(fd);
441 if (key == NULL)
442 return NULL;
443 if (PyDict_GetItem(self->dict, key) == NULL) {
444 errno = ENOENT;
445 PyErr_SetFromErrno(PyExc_IOError);
446 return NULL;
447 }
448 value = PyInt_FromLong(events);
449 if (value == NULL) {
450 Py_DECREF(key);
451 return NULL;
452 }
453 err = PyDict_SetItem(self->dict, key, value);
454 Py_DECREF(key);
455 Py_DECREF(value);
456 if (err < 0)
457 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000458
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000459 self->ufd_uptodate = 0;
460
461 Py_INCREF(Py_None);
462 return Py_None;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000463}
464
465
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000466PyDoc_STRVAR(poll_unregister_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000467"unregister(fd) -> None\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000468Remove a file descriptor being tracked by the polling object.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000469
470static PyObject *
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000471poll_unregister(pollObject *self, PyObject *o)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000472{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000473 PyObject *key;
474 int fd;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000475
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000476 fd = PyObject_AsFileDescriptor( o );
477 if (fd == -1)
478 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000479
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000480 /* Check whether the fd is already in the array */
481 key = PyInt_FromLong(fd);
482 if (key == NULL)
483 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000484
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000485 if (PyDict_DelItem(self->dict, key) == -1) {
486 Py_DECREF(key);
487 /* This will simply raise the KeyError set by PyDict_DelItem
488 if the file descriptor isn't registered. */
489 return NULL;
490 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000491
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000492 Py_DECREF(key);
493 self->ufd_uptodate = 0;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000494
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000495 Py_INCREF(Py_None);
496 return Py_None;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000497}
498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000499PyDoc_STRVAR(poll_poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000500"poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
501Polls the set of registered file descriptors, returning a list containing \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000502any descriptors that have events or errors to report.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000503
504static PyObject *
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000505poll_poll(pollObject *self, PyObject *args)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000506{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000507 PyObject *result_list = NULL, *tout = NULL;
508 int timeout = 0, poll_result, i, j;
509 PyObject *value = NULL, *num = NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000510
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000511 if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
512 return NULL;
513 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000514
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000515 /* Check values for timeout */
516 if (tout == NULL || tout == Py_None)
517 timeout = -1;
518 else if (!PyNumber_Check(tout)) {
519 PyErr_SetString(PyExc_TypeError,
520 "timeout must be an integer or None");
521 return NULL;
522 }
523 else {
524 tout = PyNumber_Int(tout);
525 if (!tout)
526 return NULL;
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200527 timeout = _PyInt_AsInt(tout);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000528 Py_DECREF(tout);
529 if (timeout == -1 && PyErr_Occurred())
530 return NULL;
531 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000532
Riccardo Coccioli27b951c2017-10-18 14:04:04 +0200533 /* On some OSes, typically BSD-based ones, the timeout parameter of the
534 poll() syscall, when negative, must be exactly INFTIM, where defined,
535 or -1. See issue 31334. */
536 if (timeout < 0) {
537#ifdef INFTIM
538 timeout = INFTIM;
539#else
540 timeout = -1;
541#endif
542 }
543
Serhiy Storchakac3603892013-08-20 20:38:21 +0300544 /* Avoid concurrent poll() invocation, issue 8865 */
545 if (self->poll_running) {
546 PyErr_SetString(PyExc_RuntimeError,
547 "concurrent poll() invocation");
548 return NULL;
549 }
550
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000551 /* Ensure the ufd array is up to date */
552 if (!self->ufd_uptodate)
553 if (update_ufd_array(self) == 0)
554 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000555
Serhiy Storchakac3603892013-08-20 20:38:21 +0300556 self->poll_running = 1;
557
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000558 /* call poll() */
559 Py_BEGIN_ALLOW_THREADS
560 poll_result = poll(self->ufds, self->ufd_len, timeout);
561 Py_END_ALLOW_THREADS
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000562
Serhiy Storchakac3603892013-08-20 20:38:21 +0300563 self->poll_running = 0;
564
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000565 if (poll_result < 0) {
566 PyErr_SetFromErrno(SelectError);
567 return NULL;
568 }
569
570 /* build the result list */
571
572 result_list = PyList_New(poll_result);
573 if (!result_list)
574 return NULL;
575 else {
576 for (i = 0, j = 0; j < poll_result; j++) {
577 /* skip to the next fired descriptor */
578 while (!self->ufds[i].revents) {
579 i++;
580 }
581 /* if we hit a NULL return, set value to NULL
582 and break out of loop; code at end will
583 clean up result_list */
584 value = PyTuple_New(2);
585 if (value == NULL)
586 goto error;
587 num = PyInt_FromLong(self->ufds[i].fd);
588 if (num == NULL) {
589 Py_DECREF(value);
590 goto error;
591 }
592 PyTuple_SET_ITEM(value, 0, num);
593
594 /* The &0xffff is a workaround for AIX. 'revents'
595 is a 16-bit short, and IBM assigned POLLNVAL
596 to be 0x8000, so the conversion to int results
597 in a negative number. See SF bug #923315. */
598 num = PyInt_FromLong(self->ufds[i].revents & 0xffff);
599 if (num == NULL) {
600 Py_DECREF(value);
601 goto error;
602 }
603 PyTuple_SET_ITEM(value, 1, num);
604 if ((PyList_SetItem(result_list, j, value)) == -1) {
605 Py_DECREF(value);
606 goto error;
607 }
608 i++;
609 }
610 }
611 return result_list;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000612
613 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000614 Py_DECREF(result_list);
615 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000616}
617
618static PyMethodDef poll_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000619 {"register", (PyCFunction)poll_register,
620 METH_VARARGS, poll_register_doc},
621 {"modify", (PyCFunction)poll_modify,
622 METH_VARARGS, poll_modify_doc},
623 {"unregister", (PyCFunction)poll_unregister,
624 METH_O, poll_unregister_doc},
625 {"poll", (PyCFunction)poll_poll,
626 METH_VARARGS, poll_poll_doc},
627 {NULL, NULL} /* sentinel */
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000628};
629
630static pollObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000631newPollObject(void)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000632{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000633 pollObject *self;
634 self = PyObject_New(pollObject, &poll_Type);
635 if (self == NULL)
636 return NULL;
637 /* ufd_uptodate is a Boolean, denoting whether the
638 array pointed to by ufds matches the contents of the dictionary. */
639 self->ufd_uptodate = 0;
640 self->ufds = NULL;
Serhiy Storchakac3603892013-08-20 20:38:21 +0300641 self->poll_running = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000642 self->dict = PyDict_New();
643 if (self->dict == NULL) {
644 Py_DECREF(self);
645 return NULL;
646 }
647 return self;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000648}
649
650static void
651poll_dealloc(pollObject *self)
652{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000653 if (self->ufds != NULL)
654 PyMem_DEL(self->ufds);
655 Py_XDECREF(self->dict);
656 PyObject_Del(self);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000657}
658
659static PyObject *
660poll_getattr(pollObject *self, char *name)
661{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000662 return Py_FindMethod(poll_methods, (PyObject *)self, name);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000663}
664
Tim Peters0c322792002-07-17 16:49:03 +0000665static PyTypeObject poll_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000666 /* The ob_type field must be initialized in the module init function
667 * to be portable to Windows without using C++. */
668 PyVarObject_HEAD_INIT(NULL, 0)
669 "select.poll", /*tp_name*/
670 sizeof(pollObject), /*tp_basicsize*/
671 0, /*tp_itemsize*/
672 /* methods */
673 (destructor)poll_dealloc, /*tp_dealloc*/
674 0, /*tp_print*/
675 (getattrfunc)poll_getattr, /*tp_getattr*/
676 0, /*tp_setattr*/
677 0, /*tp_compare*/
678 0, /*tp_repr*/
679 0, /*tp_as_number*/
680 0, /*tp_as_sequence*/
681 0, /*tp_as_mapping*/
682 0, /*tp_hash*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000683};
684
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000685PyDoc_STRVAR(poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000686"Returns a polling object, which supports registering and\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000687unregistering file descriptors, and then polling them for I/O events.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000688
689static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000690select_poll(PyObject *self, PyObject *unused)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000691{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000692 return (PyObject *)newPollObject();
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000693}
Ronald Oussoren32fd16e2006-04-23 12:36:23 +0000694
695#ifdef __APPLE__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000696/*
Ronald Oussoren32fd16e2006-04-23 12:36:23 +0000697 * On some systems poll() sets errno on invalid file descriptors. We test
698 * for this at runtime because this bug may be fixed or introduced between
699 * OS releases.
700 */
701static int select_have_broken_poll(void)
702{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000703 int poll_test;
704 int filedes[2];
Ronald Oussoren32fd16e2006-04-23 12:36:23 +0000705
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000706 struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 };
Ronald Oussoren32fd16e2006-04-23 12:36:23 +0000707
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000708 /* Create a file descriptor to make invalid */
709 if (pipe(filedes) < 0) {
710 return 1;
711 }
712 poll_struct.fd = filedes[0];
713 close(filedes[0]);
714 close(filedes[1]);
715 poll_test = poll(&poll_struct, 1, 0);
716 if (poll_test < 0) {
717 return 1;
718 } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) {
719 return 1;
720 }
721 return 0;
Ronald Oussoren32fd16e2006-04-23 12:36:23 +0000722}
723#endif /* __APPLE__ */
724
725#endif /* HAVE_POLL */
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000726
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000727#ifdef HAVE_EPOLL
728/* **************************************************************************
729 * epoll interface for Linux 2.6
730 *
731 * Written by Christian Heimes
732 * Inspired by Twisted's _epoll.pyx and select.poll()
733 */
734
735#ifdef HAVE_SYS_EPOLL_H
736#include <sys/epoll.h>
737#endif
738
739typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000740 PyObject_HEAD
741 SOCKET epfd; /* epoll control file descriptor */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000742} pyEpoll_Object;
743
744static PyTypeObject pyEpoll_Type;
745#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type))
746
747static PyObject *
748pyepoll_err_closed(void)
749{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000750 PyErr_SetString(PyExc_ValueError, "I/O operation on closed epoll fd");
751 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000752}
753
754static int
755pyepoll_internal_close(pyEpoll_Object *self)
756{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000757 int save_errno = 0;
758 if (self->epfd >= 0) {
759 int epfd = self->epfd;
760 self->epfd = -1;
761 Py_BEGIN_ALLOW_THREADS
762 if (close(epfd) < 0)
763 save_errno = errno;
764 Py_END_ALLOW_THREADS
765 }
766 return save_errno;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000767}
768
769static PyObject *
770newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
771{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000772 pyEpoll_Object *self;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000773
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000774 if (sizehint == -1) {
775 sizehint = FD_SETSIZE-1;
776 }
777 else if (sizehint < 1) {
778 PyErr_Format(PyExc_ValueError,
779 "sizehint must be greater zero, got %d",
780 sizehint);
781 return NULL;
782 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000783
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000784 assert(type != NULL && type->tp_alloc != NULL);
785 self = (pyEpoll_Object *) type->tp_alloc(type, 0);
786 if (self == NULL)
787 return NULL;
788
789 if (fd == -1) {
790 Py_BEGIN_ALLOW_THREADS
791 self->epfd = epoll_create(sizehint);
792 Py_END_ALLOW_THREADS
793 }
794 else {
795 self->epfd = fd;
796 }
797 if (self->epfd < 0) {
798 Py_DECREF(self);
799 PyErr_SetFromErrno(PyExc_IOError);
800 return NULL;
801 }
802 return (PyObject *)self;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000803}
804
805
806static PyObject *
807pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
808{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000809 int sizehint = -1;
810 static char *kwlist[] = {"sizehint", NULL};
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000811
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000812 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist,
813 &sizehint))
814 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000815
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000816 return newPyEpoll_Object(type, sizehint, -1);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000817}
818
819
820static void
821pyepoll_dealloc(pyEpoll_Object *self)
822{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000823 (void)pyepoll_internal_close(self);
824 Py_TYPE(self)->tp_free(self);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000825}
826
827static PyObject*
828pyepoll_close(pyEpoll_Object *self)
829{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000830 errno = pyepoll_internal_close(self);
831 if (errno < 0) {
832 PyErr_SetFromErrno(PyExc_IOError);
833 return NULL;
834 }
835 Py_RETURN_NONE;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000836}
837
838PyDoc_STRVAR(pyepoll_close_doc,
839"close() -> None\n\
840\n\
841Close the epoll control file descriptor. Further operations on the epoll\n\
842object will raise an exception.");
843
844static PyObject*
845pyepoll_get_closed(pyEpoll_Object *self)
846{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000847 if (self->epfd < 0)
848 Py_RETURN_TRUE;
849 else
850 Py_RETURN_FALSE;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000851}
852
853static PyObject*
854pyepoll_fileno(pyEpoll_Object *self)
855{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000856 if (self->epfd < 0)
857 return pyepoll_err_closed();
858 return PyInt_FromLong(self->epfd);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000859}
860
861PyDoc_STRVAR(pyepoll_fileno_doc,
862"fileno() -> int\n\
863\n\
864Return the epoll control file descriptor.");
865
866static PyObject*
867pyepoll_fromfd(PyObject *cls, PyObject *args)
868{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000869 SOCKET fd;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000870
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000871 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
872 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000873
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000874 return newPyEpoll_Object((PyTypeObject*)cls, -1, fd);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000875}
876
877PyDoc_STRVAR(pyepoll_fromfd_doc,
878"fromfd(fd) -> epoll\n\
879\n\
880Create an epoll object from a given control fd.");
881
882static PyObject *
883pyepoll_internal_ctl(int epfd, int op, PyObject *pfd, unsigned int events)
884{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000885 struct epoll_event ev;
886 int result;
887 int fd;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000888
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000889 if (epfd < 0)
890 return pyepoll_err_closed();
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000891
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000892 fd = PyObject_AsFileDescriptor(pfd);
893 if (fd == -1) {
894 return NULL;
895 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000896
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000897 switch(op) {
898 case EPOLL_CTL_ADD:
899 case EPOLL_CTL_MOD:
900 ev.events = events;
901 ev.data.fd = fd;
902 Py_BEGIN_ALLOW_THREADS
903 result = epoll_ctl(epfd, op, fd, &ev);
904 Py_END_ALLOW_THREADS
905 break;
906 case EPOLL_CTL_DEL:
907 /* In kernel versions before 2.6.9, the EPOLL_CTL_DEL
908 * operation required a non-NULL pointer in event, even
909 * though this argument is ignored. */
910 Py_BEGIN_ALLOW_THREADS
911 result = epoll_ctl(epfd, op, fd, &ev);
912 if (errno == EBADF) {
913 /* fd already closed */
914 result = 0;
915 errno = 0;
916 }
917 Py_END_ALLOW_THREADS
918 break;
919 default:
920 result = -1;
921 errno = EINVAL;
922 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000923
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000924 if (result < 0) {
925 PyErr_SetFromErrno(PyExc_IOError);
926 return NULL;
927 }
928 Py_RETURN_NONE;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000929}
930
931static PyObject *
932pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
933{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000934 PyObject *pfd;
935 unsigned int events = EPOLLIN | EPOLLOUT | EPOLLPRI;
936 static char *kwlist[] = {"fd", "eventmask", NULL};
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000937
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000938 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|I:register", kwlist,
939 &pfd, &events)) {
940 return NULL;
941 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000942
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000943 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_ADD, pfd, events);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000944}
945
946PyDoc_STRVAR(pyepoll_register_doc,
Georg Brandl7d4bfb32010-08-02 21:44:25 +0000947"register(fd[, eventmask]) -> None\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000948\n\
Senthil Kumaran2bd91002011-06-26 23:50:35 -0700949Registers a new fd or raises an IOError if the fd is already registered.\n\
Andrew M. Kuchlinga8c3f2b2008-03-26 00:16:50 +0000950fd is the target file descriptor of the operation.\n\
951events is a bit set composed of the various EPOLL constants; the default\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000952is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
953\n\
954The epoll interface supports all file descriptors that support poll.");
955
956static PyObject *
957pyepoll_modify(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
958{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000959 PyObject *pfd;
960 unsigned int events;
961 static char *kwlist[] = {"fd", "eventmask", NULL};
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000962
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000963 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OI:modify", kwlist,
964 &pfd, &events)) {
965 return NULL;
966 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000967
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000968 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_MOD, pfd, events);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000969}
970
971PyDoc_STRVAR(pyepoll_modify_doc,
972"modify(fd, eventmask) -> None\n\
973\n\
974fd is the target file descriptor of the operation\n\
975events is a bit set composed of the various EPOLL constants");
976
977static PyObject *
978pyepoll_unregister(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
979{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000980 PyObject *pfd;
981 static char *kwlist[] = {"fd", NULL};
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000982
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000983 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:unregister", kwlist,
984 &pfd)) {
985 return NULL;
986 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000987
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000988 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_DEL, pfd, 0);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000989}
990
991PyDoc_STRVAR(pyepoll_unregister_doc,
992"unregister(fd) -> None\n\
993\n\
994fd is the target file descriptor of the operation.");
995
996static PyObject *
997pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
998{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000999 double dtimeout = -1.;
1000 int timeout;
1001 int maxevents = -1;
1002 int nfds, i;
1003 PyObject *elist = NULL, *etuple = NULL;
1004 struct epoll_event *evs = NULL;
1005 static char *kwlist[] = {"timeout", "maxevents", NULL};
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001006
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001007 if (self->epfd < 0)
1008 return pyepoll_err_closed();
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001009
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001010 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|di:poll", kwlist,
1011 &dtimeout, &maxevents)) {
1012 return NULL;
1013 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001014
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001015 if (dtimeout < 0) {
1016 timeout = -1;
1017 }
1018 else if (dtimeout * 1000.0 > INT_MAX) {
1019 PyErr_SetString(PyExc_OverflowError,
1020 "timeout is too large");
1021 return NULL;
1022 }
1023 else {
1024 timeout = (int)(dtimeout * 1000.0);
1025 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001026
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001027 if (maxevents == -1) {
1028 maxevents = FD_SETSIZE-1;
1029 }
1030 else if (maxevents < 1) {
1031 PyErr_Format(PyExc_ValueError,
1032 "maxevents must be greater than 0, got %d",
1033 maxevents);
1034 return NULL;
1035 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001036
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001037 evs = PyMem_New(struct epoll_event, maxevents);
1038 if (evs == NULL) {
1039 Py_DECREF(self);
1040 PyErr_NoMemory();
1041 return NULL;
1042 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001043
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001044 Py_BEGIN_ALLOW_THREADS
1045 nfds = epoll_wait(self->epfd, evs, maxevents, timeout);
1046 Py_END_ALLOW_THREADS
1047 if (nfds < 0) {
1048 PyErr_SetFromErrno(PyExc_IOError);
1049 goto error;
1050 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001051
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001052 elist = PyList_New(nfds);
1053 if (elist == NULL) {
1054 goto error;
1055 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001056
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001057 for (i = 0; i < nfds; i++) {
1058 etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events);
1059 if (etuple == NULL) {
1060 Py_CLEAR(elist);
1061 goto error;
1062 }
1063 PyList_SET_ITEM(elist, i, etuple);
1064 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001065
Georg Brandl018a3622008-03-26 12:57:47 +00001066 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001067 PyMem_Free(evs);
1068 return elist;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001069}
1070
1071PyDoc_STRVAR(pyepoll_poll_doc,
1072"poll([timeout=-1[, maxevents=-1]]) -> [(fd, events), (...)]\n\
1073\n\
1074Wait for events on the epoll file descriptor for a maximum time of timeout\n\
1075in seconds (as float). -1 makes poll wait indefinitely.\n\
1076Up to maxevents are returned to the caller.");
1077
1078static PyMethodDef pyepoll_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001079 {"fromfd", (PyCFunction)pyepoll_fromfd,
1080 METH_VARARGS | METH_CLASS, pyepoll_fromfd_doc},
1081 {"close", (PyCFunction)pyepoll_close, METH_NOARGS,
1082 pyepoll_close_doc},
1083 {"fileno", (PyCFunction)pyepoll_fileno, METH_NOARGS,
1084 pyepoll_fileno_doc},
1085 {"modify", (PyCFunction)pyepoll_modify,
1086 METH_VARARGS | METH_KEYWORDS, pyepoll_modify_doc},
1087 {"register", (PyCFunction)pyepoll_register,
1088 METH_VARARGS | METH_KEYWORDS, pyepoll_register_doc},
1089 {"unregister", (PyCFunction)pyepoll_unregister,
1090 METH_VARARGS | METH_KEYWORDS, pyepoll_unregister_doc},
1091 {"poll", (PyCFunction)pyepoll_poll,
1092 METH_VARARGS | METH_KEYWORDS, pyepoll_poll_doc},
1093 {NULL, NULL},
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001094};
1095
1096static PyGetSetDef pyepoll_getsetlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001097 {"closed", (getter)pyepoll_get_closed, NULL,
1098 "True if the epoll handler is closed"},
1099 {0},
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001100};
1101
1102PyDoc_STRVAR(pyepoll_doc,
1103"select.epoll([sizehint=-1])\n\
1104\n\
1105Returns an epolling object\n\
1106\n\
1107sizehint must be a positive integer or -1 for the default size. The\n\
1108sizehint is used to optimize internal data structures. It doesn't limit\n\
1109the maximum number of monitored events.");
1110
1111static PyTypeObject pyEpoll_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001112 PyVarObject_HEAD_INIT(NULL, 0)
1113 "select.epoll", /* tp_name */
1114 sizeof(pyEpoll_Object), /* tp_basicsize */
1115 0, /* tp_itemsize */
1116 (destructor)pyepoll_dealloc, /* tp_dealloc */
1117 0, /* tp_print */
1118 0, /* tp_getattr */
1119 0, /* tp_setattr */
1120 0, /* tp_compare */
1121 0, /* tp_repr */
1122 0, /* tp_as_number */
1123 0, /* tp_as_sequence */
1124 0, /* tp_as_mapping */
1125 0, /* tp_hash */
1126 0, /* tp_call */
1127 0, /* tp_str */
1128 PyObject_GenericGetAttr, /* tp_getattro */
1129 0, /* tp_setattro */
1130 0, /* tp_as_buffer */
1131 Py_TPFLAGS_DEFAULT, /* tp_flags */
1132 pyepoll_doc, /* tp_doc */
1133 0, /* tp_traverse */
1134 0, /* tp_clear */
1135 0, /* tp_richcompare */
1136 0, /* tp_weaklistoffset */
1137 0, /* tp_iter */
1138 0, /* tp_iternext */
1139 pyepoll_methods, /* tp_methods */
1140 0, /* tp_members */
1141 pyepoll_getsetlist, /* tp_getset */
1142 0, /* tp_base */
1143 0, /* tp_dict */
1144 0, /* tp_descr_get */
1145 0, /* tp_descr_set */
1146 0, /* tp_dictoffset */
1147 0, /* tp_init */
1148 0, /* tp_alloc */
1149 pyepoll_new, /* tp_new */
1150 0, /* tp_free */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001151};
1152
1153#endif /* HAVE_EPOLL */
1154
1155#ifdef HAVE_KQUEUE
1156/* **************************************************************************
1157 * kqueue interface for BSD
1158 *
1159 * Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
1160 * All rights reserved.
1161 *
1162 * Redistribution and use in source and binary forms, with or without
1163 * modification, are permitted provided that the following conditions
1164 * are met:
1165 * 1. Redistributions of source code must retain the above copyright
1166 * notice, this list of conditions and the following disclaimer.
1167 * 2. Redistributions in binary form must reproduce the above copyright
1168 * notice, this list of conditions and the following disclaimer in the
1169 * documentation and/or other materials provided with the distribution.
1170 *
1171 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1172 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1173 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1174 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1175 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1176 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1177 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1178 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1179 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1180 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1181 * SUCH DAMAGE.
1182 */
1183
1184#ifdef HAVE_SYS_EVENT_H
1185#include <sys/event.h>
1186#endif
1187
1188PyDoc_STRVAR(kqueue_event_doc,
Georg Brandlfa1ffb62009-12-29 21:09:17 +00001189"kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001190\n\
1191This object is the equivalent of the struct kevent for the C API.\n\
1192\n\
1193See the kqueue manpage for more detailed information about the meaning\n\
1194of the arguments.\n\
1195\n\
1196One minor note: while you might hope that udata could store a\n\
1197reference to a python object, it cannot, because it is impossible to\n\
1198keep a proper reference count of the object once it's passed into the\n\
1199kernel. Therefore, I have restricted it to only storing an integer. I\n\
1200recommend ignoring it and simply using the 'ident' field to key off\n\
1201of. You could also set up a dictionary on the python side to store a\n\
1202udata->object mapping.");
1203
1204typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001205 PyObject_HEAD
1206 struct kevent e;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001207} kqueue_event_Object;
1208
1209static PyTypeObject kqueue_event_Type;
1210
1211#define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type))
1212
1213typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001214 PyObject_HEAD
1215 SOCKET kqfd; /* kqueue control fd */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001216} kqueue_queue_Object;
1217
1218static PyTypeObject kqueue_queue_Type;
1219
1220#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type))
1221
Antoine Pitrou323b9da2009-11-04 19:25:14 +00001222#if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P)
1223# error uintptr_t does not match void *!
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001224#elif defined(HAVE_LONG_LONG) && (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG)
Antoine Pitrou323b9da2009-11-04 19:25:14 +00001225# define T_UINTPTRT T_ULONGLONG
1226# define T_INTPTRT T_LONGLONG
Antoine Pitrou323b9da2009-11-04 19:25:14 +00001227# define UINTPTRT_FMT_UNIT "K"
1228# define INTPTRT_FMT_UNIT "L"
1229#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG)
1230# define T_UINTPTRT T_ULONG
1231# define T_INTPTRT T_LONG
Antoine Pitrou323b9da2009-11-04 19:25:14 +00001232# define UINTPTRT_FMT_UNIT "k"
1233# define INTPTRT_FMT_UNIT "l"
1234#elif (SIZEOF_UINTPTR_T == SIZEOF_INT)
1235# define T_UINTPTRT T_UINT
1236# define T_INTPTRT T_INT
Antoine Pitrou323b9da2009-11-04 19:25:14 +00001237# define UINTPTRT_FMT_UNIT "I"
1238# define INTPTRT_FMT_UNIT "i"
1239#else
1240# error uintptr_t does not match int, long, or long long!
1241#endif
1242
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001243#if defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8
1244# define T_INT64 T_LONGLONG
1245# define INT64_FMT_UNIT "L"
1246#elif SIZEOF_LONG == 8
1247# define T_INT64 T_LONG
1248# define INT64_FMT_UNIT "l"
1249#elif SIZEOF_INT == 8
1250# define T_INT64 T_INT
1251# define INT64_FMT_UNIT "i"
1252#else
1253# define INT64_FMT_UNIT "_"
1254#endif
1255
1256#if defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 4
1257# define T_UINT32 T_ULONGLONG
1258# define UINT32_FMT_UNIT "K"
1259#elif SIZEOF_LONG == 4
1260# define T_UINT32 T_ULONG
1261# define UINT32_FMT_UNIT "k"
1262#elif SIZEOF_INT == 4
1263# define T_UINT32 T_UINT
1264# define UINT32_FMT_UNIT "I"
1265#else
1266# define UINT32_FMT_UNIT "_"
1267#endif
1268
Charles-Francois Natali880359c2013-05-06 21:21:57 +02001269/*
1270 * kevent is not standard and its members vary across BSDs.
1271 */
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001272#ifdef __NetBSD__
1273# define FILTER_TYPE T_UINT32
1274# define FILTER_FMT_UNIT UINT32_FMT_UNIT
1275# define FLAGS_TYPE T_UINT32
1276# define FLAGS_FMT_UNIT UINT32_FMT_UNIT
1277# define FFLAGS_TYPE T_UINT32
1278# define FFLAGS_FMT_UNIT UINT32_FMT_UNIT
Charles-Francois Natali880359c2013-05-06 21:21:57 +02001279#else
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001280# define FILTER_TYPE T_SHORT
1281# define FILTER_FMT_UNIT "h"
1282# define FLAGS_TYPE T_USHORT
1283# define FLAGS_FMT_UNIT "H"
1284# define FFLAGS_TYPE T_UINT
1285# define FFLAGS_FMT_UNIT "I"
1286#endif
1287
1288#ifdef __FreeBSD__
1289# define DATA_TYPE T_INTPTRT
1290# define DATA_FMT_UNIT INTPTR_FMT_UNIT
1291#else
1292# define DATA_TYPE T_INT64
1293# define DATA_FMT_UNIT INT64_FMT_UNIT
Charles-Francois Natali880359c2013-05-06 21:21:57 +02001294#endif
1295
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001296/* Unfortunately, we can't store python objects in udata, because
1297 * kevents in the kernel can be removed without warning, which would
1298 * forever lose the refcount on the object stored with it.
1299 */
1300
1301#define KQ_OFF(x) offsetof(kqueue_event_Object, x)
1302static struct PyMemberDef kqueue_event_members[] = {
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001303 {"ident", T_UINTPTRT, KQ_OFF(e.ident)},
1304 {"filter", FILTER_TYPE, KQ_OFF(e.filter)},
1305 {"flags", FLAGS_TYPE, KQ_OFF(e.flags)},
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001306 {"fflags", T_UINT, KQ_OFF(e.fflags)},
Charles-Francois Natali880359c2013-05-06 21:21:57 +02001307 {"data", DATA_TYPE, KQ_OFF(e.data)},
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001308 {"udata", T_UINTPTRT, KQ_OFF(e.udata)},
1309 {NULL} /* Sentinel */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001310};
1311#undef KQ_OFF
1312
1313static PyObject *
Georg Brandlea370a92010-02-23 21:48:57 +00001314
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001315kqueue_event_repr(kqueue_event_Object *s)
1316{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001317 char buf[1024];
1318 PyOS_snprintf(
1319 buf, sizeof(buf),
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001320#ifdef HAVE_LONG_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001321 "<select.kevent ident=%zu filter=%d flags=0x%x fflags=0x%x "
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001322 "data=0x%llx udata=%p>",
1323 (size_t)(s->e.ident), (int)s->e.filter, (unsigned int)s->e.flags,
1324 (unsigned int)s->e.fflags, (long long)(s->e.data), (void *)s->e.udata);
1325#else
1326 "<select.kevent ident=%zu filter=%d flags=0x%x fflags=0x%x "
1327 "data=0x%llx udata=%p>",
1328 (size_t)(s->e.ident), (int)s->e.filter, (unsigned int)s->e.flags,
1329 (unsigned int)s->e.fflags, (long)(s->e.data), (void *)s->e.udata);
1330#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001331 return PyString_FromString(buf);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001332}
1333
1334static int
1335kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds)
1336{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001337 PyObject *pfd;
1338 static char *kwlist[] = {"ident", "filter", "flags", "fflags",
1339 "data", "udata", NULL};
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001340 static const char fmt[] = "O|"
1341 FILTER_FMT_UNIT FLAGS_FMT_UNIT FFLAGS_FMT_UNIT DATA_FMT_UNIT
1342 UINTPTRT_FMT_UNIT ":kevent";
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001343
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001344 EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001345
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001346 if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist,
1347 &pfd, &(self->e.filter), &(self->e.flags),
1348 &(self->e.fflags), &(self->e.data), &(self->e.udata))) {
1349 return -1;
1350 }
1351
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001352 if (PyInt_Check(pfd)) {
1353 self->e.ident = PyInt_AsUnsignedLongMask(pfd);
1354 }
1355 else {
1356 if (PyInt_Check(pfd) || PyLong_Check(pfd)) {
1357 self->e.ident = PyLong_AsSize_t(pfd);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001358 }
1359 else {
1360 self->e.ident = PyObject_AsFileDescriptor(pfd);
1361 }
1362 if (PyErr_Occurred()) {
1363 return -1;
1364 }
1365 return 0;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001366}
1367
1368static PyObject *
1369kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001370 int op)
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001371{
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001372 int result;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001373
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001374 if (!kqueue_event_Check(o)) {
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001375 Py_INCREF(Py_NotImplemented);
1376 return Py_NotImplemented;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001377 }
Serhiy Storchaka8cbf4e12017-10-31 16:13:52 +02001378
1379#define CMP(a, b) ((a) != (b)) ? ((a) < (b) ? -1 : 1)
1380 result = CMP(s->e.ident, o->e.ident)
1381 : CMP(s->e.filter, o->e.filter)
1382 : CMP(s->e.flags, o->e.flags)
1383 : CMP(s->e.fflags, o->e.fflags)
1384 : CMP(s->e.data, o->e.data)
1385 : CMP((Py_intptr_t)s->e.udata, (Py_intptr_t)o->e.udata)
1386 : 0;
1387#undef CMP
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001388
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001389 switch (op) {
1390 case Py_EQ:
1391 result = (result == 0);
1392 break;
1393 case Py_NE:
1394 result = (result != 0);
1395 break;
1396 case Py_LE:
1397 result = (result <= 0);
1398 break;
1399 case Py_GE:
1400 result = (result >= 0);
1401 break;
1402 case Py_LT:
1403 result = (result < 0);
1404 break;
1405 case Py_GT:
1406 result = (result > 0);
1407 break;
1408 }
1409 return PyBool_FromLong((long)result);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001410}
1411
1412static PyTypeObject kqueue_event_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001413 PyVarObject_HEAD_INIT(NULL, 0)
1414 "select.kevent", /* tp_name */
1415 sizeof(kqueue_event_Object), /* tp_basicsize */
1416 0, /* tp_itemsize */
1417 0, /* tp_dealloc */
1418 0, /* tp_print */
1419 0, /* tp_getattr */
1420 0, /* tp_setattr */
1421 0, /* tp_compare */
1422 (reprfunc)kqueue_event_repr, /* tp_repr */
1423 0, /* tp_as_number */
1424 0, /* tp_as_sequence */
1425 0, /* tp_as_mapping */
1426 0, /* tp_hash */
1427 0, /* tp_call */
1428 0, /* tp_str */
1429 0, /* tp_getattro */
1430 0, /* tp_setattro */
1431 0, /* tp_as_buffer */
1432 Py_TPFLAGS_DEFAULT, /* tp_flags */
1433 kqueue_event_doc, /* tp_doc */
1434 0, /* tp_traverse */
1435 0, /* tp_clear */
1436 (richcmpfunc)kqueue_event_richcompare, /* tp_richcompare */
1437 0, /* tp_weaklistoffset */
1438 0, /* tp_iter */
1439 0, /* tp_iternext */
1440 0, /* tp_methods */
1441 kqueue_event_members, /* tp_members */
1442 0, /* tp_getset */
1443 0, /* tp_base */
1444 0, /* tp_dict */
1445 0, /* tp_descr_get */
1446 0, /* tp_descr_set */
1447 0, /* tp_dictoffset */
1448 (initproc)kqueue_event_init, /* tp_init */
1449 0, /* tp_alloc */
1450 0, /* tp_new */
1451 0, /* tp_free */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001452};
1453
1454static PyObject *
1455kqueue_queue_err_closed(void)
1456{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001457 PyErr_SetString(PyExc_ValueError, "I/O operation on closed kqueue fd");
1458 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001459}
1460
1461static int
1462kqueue_queue_internal_close(kqueue_queue_Object *self)
1463{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001464 int save_errno = 0;
1465 if (self->kqfd >= 0) {
1466 int kqfd = self->kqfd;
1467 self->kqfd = -1;
1468 Py_BEGIN_ALLOW_THREADS
1469 if (close(kqfd) < 0)
1470 save_errno = errno;
1471 Py_END_ALLOW_THREADS
1472 }
1473 return save_errno;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001474}
1475
1476static PyObject *
1477newKqueue_Object(PyTypeObject *type, SOCKET fd)
1478{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001479 kqueue_queue_Object *self;
1480 assert(type != NULL && type->tp_alloc != NULL);
1481 self = (kqueue_queue_Object *) type->tp_alloc(type, 0);
1482 if (self == NULL) {
1483 return NULL;
1484 }
1485
1486 if (fd == -1) {
1487 Py_BEGIN_ALLOW_THREADS
1488 self->kqfd = kqueue();
1489 Py_END_ALLOW_THREADS
1490 }
1491 else {
1492 self->kqfd = fd;
1493 }
1494 if (self->kqfd < 0) {
1495 Py_DECREF(self);
1496 PyErr_SetFromErrno(PyExc_IOError);
1497 return NULL;
1498 }
1499 return (PyObject *)self;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001500}
1501
1502static PyObject *
1503kqueue_queue_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1504{
1505
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001506 if ((args != NULL && PyObject_Size(args)) ||
1507 (kwds != NULL && PyObject_Size(kwds))) {
1508 PyErr_SetString(PyExc_ValueError,
1509 "select.kqueue doesn't accept arguments");
1510 return NULL;
1511 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001512
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001513 return newKqueue_Object(type, -1);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001514}
1515
1516static void
1517kqueue_queue_dealloc(kqueue_queue_Object *self)
1518{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001519 kqueue_queue_internal_close(self);
1520 Py_TYPE(self)->tp_free(self);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001521}
1522
1523static PyObject*
1524kqueue_queue_close(kqueue_queue_Object *self)
1525{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001526 errno = kqueue_queue_internal_close(self);
1527 if (errno < 0) {
1528 PyErr_SetFromErrno(PyExc_IOError);
1529 return NULL;
1530 }
1531 Py_RETURN_NONE;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001532}
1533
1534PyDoc_STRVAR(kqueue_queue_close_doc,
1535"close() -> None\n\
1536\n\
1537Close the kqueue control file descriptor. Further operations on the kqueue\n\
1538object will raise an exception.");
1539
1540static PyObject*
1541kqueue_queue_get_closed(kqueue_queue_Object *self)
1542{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001543 if (self->kqfd < 0)
1544 Py_RETURN_TRUE;
1545 else
1546 Py_RETURN_FALSE;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001547}
1548
1549static PyObject*
1550kqueue_queue_fileno(kqueue_queue_Object *self)
1551{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001552 if (self->kqfd < 0)
1553 return kqueue_queue_err_closed();
1554 return PyInt_FromLong(self->kqfd);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001555}
1556
1557PyDoc_STRVAR(kqueue_queue_fileno_doc,
1558"fileno() -> int\n\
1559\n\
1560Return the kqueue control file descriptor.");
1561
1562static PyObject*
1563kqueue_queue_fromfd(PyObject *cls, PyObject *args)
1564{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001565 SOCKET fd;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001566
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001567 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
1568 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001569
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001570 return newKqueue_Object((PyTypeObject*)cls, fd);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001571}
1572
1573PyDoc_STRVAR(kqueue_queue_fromfd_doc,
1574"fromfd(fd) -> kqueue\n\
1575\n\
1576Create a kqueue object from a given control fd.");
1577
1578static PyObject *
1579kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
1580{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001581 int nevents = 0;
1582 int gotevents = 0;
1583 int nchanges = 0;
1584 int i = 0;
1585 PyObject *otimeout = NULL;
1586 PyObject *ch = NULL;
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001587 PyObject *seq = NULL, *ei = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001588 PyObject *result = NULL;
1589 struct kevent *evl = NULL;
1590 struct kevent *chl = NULL;
1591 struct timespec timeoutspec;
1592 struct timespec *ptimeoutspec;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001593
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001594 if (self->kqfd < 0)
1595 return kqueue_queue_err_closed();
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001596
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001597 if (!PyArg_ParseTuple(args, "Oi|O:control", &ch, &nevents, &otimeout))
1598 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001599
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001600 if (nevents < 0) {
1601 PyErr_Format(PyExc_ValueError,
1602 "Length of eventlist must be 0 or positive, got %d",
1603 nevents);
1604 return NULL;
1605 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001606
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001607 if (otimeout == Py_None || otimeout == NULL) {
1608 ptimeoutspec = NULL;
1609 }
1610 else if (PyNumber_Check(otimeout)) {
1611 double timeout;
1612 long seconds;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001613
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001614 timeout = PyFloat_AsDouble(otimeout);
1615 if (timeout == -1 && PyErr_Occurred())
1616 return NULL;
1617 if (timeout > (double)LONG_MAX) {
1618 PyErr_SetString(PyExc_OverflowError,
1619 "timeout period too long");
1620 return NULL;
1621 }
1622 if (timeout < 0) {
1623 PyErr_SetString(PyExc_ValueError,
1624 "timeout must be positive or None");
1625 return NULL;
1626 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001627
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001628 seconds = (long)timeout;
1629 timeout = timeout - (double)seconds;
1630 timeoutspec.tv_sec = seconds;
1631 timeoutspec.tv_nsec = (long)(timeout * 1E9);
1632 ptimeoutspec = &timeoutspec;
1633 }
1634 else {
1635 PyErr_Format(PyExc_TypeError,
1636 "timeout argument must be an number "
1637 "or None, got %.200s",
1638 Py_TYPE(otimeout)->tp_name);
1639 return NULL;
1640 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001641
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001642 if (ch != NULL && ch != Py_None) {
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001643 seq = PySequence_Fast(ch, "changelist is not iterable");
1644 if (seq == NULL) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001645 return NULL;
1646 }
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001647 if (PySequence_Fast_GET_SIZE(seq) > INT_MAX) {
1648 PyErr_SetString(PyExc_OverflowError,
1649 "changelist is too long");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001650 goto error;
1651 }
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001652 nchanges = (int)PySequence_Fast_GET_SIZE(seq);
Georg Brandlea370a92010-02-23 21:48:57 +00001653
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001654 chl = PyMem_New(struct kevent, nchanges);
1655 if (chl == NULL) {
1656 PyErr_NoMemory();
1657 goto error;
1658 }
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001659 for (i = 0; i < nchanges; ++i) {
1660 ei = PySequence_Fast_GET_ITEM(seq, i);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001661 if (!kqueue_event_Check(ei)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001662 PyErr_SetString(PyExc_TypeError,
1663 "changelist must be an iterable of "
1664 "select.kevent objects");
1665 goto error;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001666 }
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001667 chl[i] = ((kqueue_event_Object *)ei)->e;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001668 }
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001669 Py_CLEAR(seq);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001670 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001671
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001672 /* event list */
1673 if (nevents) {
1674 evl = PyMem_New(struct kevent, nevents);
1675 if (evl == NULL) {
1676 PyErr_NoMemory();
1677 goto error;
1678 }
1679 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001680
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 Py_BEGIN_ALLOW_THREADS
1682 gotevents = kevent(self->kqfd, chl, nchanges,
1683 evl, nevents, ptimeoutspec);
1684 Py_END_ALLOW_THREADS
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001685
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001686 if (gotevents == -1) {
1687 PyErr_SetFromErrno(PyExc_OSError);
1688 goto error;
1689 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001690
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001691 result = PyList_New(gotevents);
1692 if (result == NULL) {
1693 goto error;
1694 }
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001695
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001696 for (i = 0; i < gotevents; i++) {
1697 kqueue_event_Object *ch;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001698
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001699 ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type);
1700 if (ch == NULL) {
1701 goto error;
1702 }
1703 ch->e = evl[i];
1704 PyList_SET_ITEM(result, i, (PyObject *)ch);
1705 }
1706 PyMem_Free(chl);
1707 PyMem_Free(evl);
1708 return result;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001709
1710 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001711 PyMem_Free(chl);
1712 PyMem_Free(evl);
1713 Py_XDECREF(result);
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001714 Py_XDECREF(seq);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001715 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001716}
1717
1718PyDoc_STRVAR(kqueue_queue_control_doc,
Georg Brandl2f3bd832008-09-21 07:14:44 +00001719"control(changelist, max_events[, timeout=None]) -> eventlist\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001720\n\
1721Calls the kernel kevent function.\n\
Serhiy Storchaka9aa60242017-10-13 00:13:11 +03001722- changelist must be an iterable of kevent objects describing the changes\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001723 to be made to the kernel's watch list or None.\n\
1724- max_events lets you specify the maximum number of events that the\n\
1725 kernel will return.\n\
1726- timeout is the maximum time to wait in seconds, or else None,\n\
1727 to wait forever. timeout accepts floats for smaller timeouts, too.");
1728
1729
1730static PyMethodDef kqueue_queue_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001731 {"fromfd", (PyCFunction)kqueue_queue_fromfd,
1732 METH_VARARGS | METH_CLASS, kqueue_queue_fromfd_doc},
1733 {"close", (PyCFunction)kqueue_queue_close, METH_NOARGS,
1734 kqueue_queue_close_doc},
1735 {"fileno", (PyCFunction)kqueue_queue_fileno, METH_NOARGS,
1736 kqueue_queue_fileno_doc},
1737 {"control", (PyCFunction)kqueue_queue_control,
1738 METH_VARARGS , kqueue_queue_control_doc},
1739 {NULL, NULL},
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001740};
1741
1742static PyGetSetDef kqueue_queue_getsetlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001743 {"closed", (getter)kqueue_queue_get_closed, NULL,
1744 "True if the kqueue handler is closed"},
1745 {0},
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001746};
1747
1748PyDoc_STRVAR(kqueue_queue_doc,
1749"Kqueue syscall wrapper.\n\
1750\n\
1751For example, to start watching a socket for input:\n\
1752>>> kq = kqueue()\n\
1753>>> sock = socket()\n\
1754>>> sock.connect((host, port))\n\
1755>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_ADD)], 0)\n\
1756\n\
1757To wait one second for it to become writeable:\n\
1758>>> kq.control(None, 1, 1000)\n\
1759\n\
1760To stop listening:\n\
1761>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_DELETE)], 0)");
1762
1763static PyTypeObject kqueue_queue_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001764 PyVarObject_HEAD_INIT(NULL, 0)
1765 "select.kqueue", /* tp_name */
1766 sizeof(kqueue_queue_Object), /* tp_basicsize */
1767 0, /* tp_itemsize */
1768 (destructor)kqueue_queue_dealloc, /* tp_dealloc */
1769 0, /* tp_print */
1770 0, /* tp_getattr */
1771 0, /* tp_setattr */
1772 0, /* tp_compare */
1773 0, /* tp_repr */
1774 0, /* tp_as_number */
1775 0, /* tp_as_sequence */
1776 0, /* tp_as_mapping */
1777 0, /* tp_hash */
1778 0, /* tp_call */
1779 0, /* tp_str */
1780 0, /* tp_getattro */
1781 0, /* tp_setattro */
1782 0, /* tp_as_buffer */
1783 Py_TPFLAGS_DEFAULT, /* tp_flags */
1784 kqueue_queue_doc, /* tp_doc */
1785 0, /* tp_traverse */
1786 0, /* tp_clear */
1787 0, /* tp_richcompare */
1788 0, /* tp_weaklistoffset */
1789 0, /* tp_iter */
1790 0, /* tp_iternext */
1791 kqueue_queue_methods, /* tp_methods */
1792 0, /* tp_members */
1793 kqueue_queue_getsetlist, /* tp_getset */
1794 0, /* tp_base */
1795 0, /* tp_dict */
1796 0, /* tp_descr_get */
1797 0, /* tp_descr_set */
1798 0, /* tp_dictoffset */
1799 0, /* tp_init */
1800 0, /* tp_alloc */
1801 kqueue_queue_new, /* tp_new */
1802 0, /* tp_free */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001803};
1804
1805#endif /* HAVE_KQUEUE */
1806/* ************************************************************************ */
1807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001808PyDoc_STRVAR(select_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001809"select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
1810\n\
1811Wait until one or more file descriptors are ready for some kind of I/O.\n\
Brett Cannon62dba4c2003-09-10 19:37:42 +00001812The first three arguments are sequences of file descriptors to be waited for:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001813rlist -- wait until ready for reading\n\
1814wlist -- wait until ready for writing\n\
1815xlist -- wait for an ``exceptional condition''\n\
1816If only one kind of condition is required, pass [] for the other lists.\n\
1817A file descriptor is either a socket or file object, or a small integer\n\
1818gotten from a fileno() method call on one of those.\n\
1819\n\
1820The optional 4th argument specifies a timeout in seconds; it may be\n\
1821a floating point number to specify fractions of seconds. If it is absent\n\
1822or None, the call will never time out.\n\
1823\n\
1824The return value is a tuple of three lists corresponding to the first three\n\
1825arguments; each contains the subset of the corresponding file descriptors\n\
1826that are ready.\n\
1827\n\
1828*** IMPORTANT NOTICE ***\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001829On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\
Andrew M. Kuchlinga8c3f2b2008-03-26 00:16:50 +00001830descriptors can be used.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001831
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00001832static PyMethodDef select_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001833 {"select", select_select, METH_VARARGS, select_doc},
Charles-François Natalia41cf292013-01-19 12:15:56 +01001834#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001835 {"poll", select_poll, METH_NOARGS, poll_doc},
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001836#endif /* HAVE_POLL */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001837 {0, 0}, /* sentinel */
Guido van Rossumed233a51992-06-23 09:07:03 +00001838};
1839
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001840PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001841"This module supports asynchronous I/O on multiple file descriptors.\n\
1842\n\
1843*** IMPORTANT NOTICE ***\n\
Neal Norwitz2a30cd02006-07-10 01:18:57 +00001844On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.");
Guido van Rossumed233a51992-06-23 09:07:03 +00001845
Mark Hammond62b1ab12002-07-23 06:31:15 +00001846PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001847initselect(void)
Guido van Rossumed233a51992-06-23 09:07:03 +00001848{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001849 PyObject *m;
1850 m = Py_InitModule3("select", select_methods, module_doc);
1851 if (m == NULL)
1852 return;
Fred Drake4baedc12002-04-01 14:53:37 +00001853
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001854 SelectError = PyErr_NewException("select.error", NULL, NULL);
1855 Py_INCREF(SelectError);
1856 PyModule_AddObject(m, "error", SelectError);
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001857
Amaury Forgeot d'Arcce32eb72009-07-09 22:37:22 +00001858#ifdef PIPE_BUF
R. David Murray1d9d16e2010-10-16 00:43:13 +00001859#ifdef HAVE_BROKEN_PIPE_BUF
1860#undef PIPE_BUF
1861#define PIPE_BUF 512
1862#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001863 PyModule_AddIntConstant(m, "PIPE_BUF", PIPE_BUF);
Amaury Forgeot d'Arcce32eb72009-07-09 22:37:22 +00001864#endif
Gregory P. Smith9d36fd22009-07-03 20:48:31 +00001865
Charles-François Natalia41cf292013-01-19 12:15:56 +01001866#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001867#ifdef __APPLE__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001868 if (select_have_broken_poll()) {
1869 if (PyObject_DelAttrString(m, "poll") == -1) {
1870 PyErr_Clear();
1871 }
1872 } else {
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001873#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001874 {
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001875#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001876 Py_TYPE(&poll_Type) = &PyType_Type;
1877 PyModule_AddIntConstant(m, "POLLIN", POLLIN);
1878 PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
1879 PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
1880 PyModule_AddIntConstant(m, "POLLERR", POLLERR);
1881 PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
1882 PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +00001883
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001884#ifdef POLLRDNORM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001885 PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001886#endif
1887#ifdef POLLRDBAND
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001888 PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001889#endif
1890#ifdef POLLWRNORM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001891 PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001892#endif
1893#ifdef POLLWRBAND
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001894 PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001895#endif
Sjoerd Mullender239f8362000-08-25 13:59:18 +00001896#ifdef POLLMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001897 PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
Sjoerd Mullender239f8362000-08-25 13:59:18 +00001898#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001899 }
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001900#endif /* HAVE_POLL */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001901
1902#ifdef HAVE_EPOLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001903 Py_TYPE(&pyEpoll_Type) = &PyType_Type;
1904 if (PyType_Ready(&pyEpoll_Type) < 0)
1905 return;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001906
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001907 Py_INCREF(&pyEpoll_Type);
1908 PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001909
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001910 PyModule_AddIntConstant(m, "EPOLLIN", EPOLLIN);
1911 PyModule_AddIntConstant(m, "EPOLLOUT", EPOLLOUT);
1912 PyModule_AddIntConstant(m, "EPOLLPRI", EPOLLPRI);
1913 PyModule_AddIntConstant(m, "EPOLLERR", EPOLLERR);
1914 PyModule_AddIntConstant(m, "EPOLLHUP", EPOLLHUP);
1915 PyModule_AddIntConstant(m, "EPOLLET", EPOLLET);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001916#ifdef EPOLLONESHOT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001917 /* Kernel 2.6.2+ */
1918 PyModule_AddIntConstant(m, "EPOLLONESHOT", EPOLLONESHOT);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001919#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001920 /* PyModule_AddIntConstant(m, "EPOLL_RDHUP", EPOLLRDHUP); */
Zachary Ware977be3e2015-08-01 21:30:11 -05001921#ifdef EPOLLRDNORM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001922 PyModule_AddIntConstant(m, "EPOLLRDNORM", EPOLLRDNORM);
Zachary Ware977be3e2015-08-01 21:30:11 -05001923#endif
1924#ifdef EPOLLRDBAND
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001925 PyModule_AddIntConstant(m, "EPOLLRDBAND", EPOLLRDBAND);
Zachary Ware977be3e2015-08-01 21:30:11 -05001926#endif
1927#ifdef EPOLLWRNORM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001928 PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
Zachary Ware977be3e2015-08-01 21:30:11 -05001929#endif
1930#ifdef EPOLLWRBAND
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001931 PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
Zachary Ware977be3e2015-08-01 21:30:11 -05001932#endif
1933#ifdef EPOLLMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001934 PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
Zachary Ware977be3e2015-08-01 21:30:11 -05001935#endif
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001936#endif /* HAVE_EPOLL */
1937
1938#ifdef HAVE_KQUEUE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001939 kqueue_event_Type.tp_new = PyType_GenericNew;
1940 Py_TYPE(&kqueue_event_Type) = &PyType_Type;
1941 if(PyType_Ready(&kqueue_event_Type) < 0)
1942 return;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001943
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001944 Py_INCREF(&kqueue_event_Type);
1945 PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001946
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001947 Py_TYPE(&kqueue_queue_Type) = &PyType_Type;
1948 if(PyType_Ready(&kqueue_queue_Type) < 0)
1949 return;
1950 Py_INCREF(&kqueue_queue_Type);
1951 PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type);
1952
1953 /* event filters */
1954 PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
1955 PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE);
1956 PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO);
1957 PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE);
1958 PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001959#ifdef EVFILT_NETDEV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001960 PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001961#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001962 PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
1963 PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001964
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001965 /* event flags */
1966 PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD);
1967 PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE);
1968 PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE);
1969 PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE);
1970 PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT);
1971 PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001972
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001973 PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS);
1974 PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001975
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001976 PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF);
1977 PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001978
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001979 /* READ WRITE filter flag */
1980 PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001981
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001982 /* VNODE filter flags */
1983 PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE);
1984 PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE);
1985 PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND);
1986 PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB);
1987 PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK);
1988 PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME);
1989 PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001990
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001991 /* PROC filter flags */
1992 PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT);
1993 PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK);
1994 PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC);
1995 PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
1996 PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001997
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001998 PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK);
1999 PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD);
2000 PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR);
2001
2002 /* NETDEV filter flags */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00002003#ifdef EVFILT_NETDEV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002004 PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP);
2005 PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
2006 PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00002007#endif
2008
2009#endif /* HAVE_KQUEUE */
Guido van Rossumed233a51992-06-23 09:07:03 +00002010}