blob: 945055f28dfe1815ff88783ad867c7d319921b06 [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 Rossum4f0fbf81996-06-12 04:22:53 +00005*/
Guido van Rossumed233a51992-06-23 09:07:03 +00006
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00007#include "Python.h"
Christian Heimes4fbc72b2008-03-22 00:47:35 +00008#include <structmember.h>
Guido van Rossumed233a51992-06-23 09:07:03 +00009
Jesus Cead8b9ae62011-11-14 19:07:41 +010010#ifdef HAVE_SYS_DEVPOLL_H
11#include <sys/resource.h>
12#include <sys/devpoll.h>
13#include <sys/types.h>
14#include <sys/stat.h>
15#include <fcntl.h>
16#endif
17
Thomas Wouters477c8d52006-05-27 19:21:47 +000018#ifdef __APPLE__
19 /* Perform runtime testing for a broken poll on OSX to make it easier
20 * to use the same binary on multiple releases of the OS.
21 */
22#undef HAVE_BROKEN_POLL
23#endif
24
Tim Petersd92dfe02000-12-12 01:18:41 +000025/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
26 64 is too small (too many people have bumped into that limit).
27 Here we boost it.
28 Users who want even more than the boosted limit should #define
29 FD_SETSIZE higher before this; e.g., via compiler /D switch.
30*/
31#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
32#define FD_SETSIZE 512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033#endif
Tim Petersd92dfe02000-12-12 01:18:41 +000034
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000035#if defined(HAVE_POLL_H)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000036#include <poll.h>
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000037#elif defined(HAVE_SYS_POLL_H)
38#include <sys/poll.h>
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000039#endif
Guido van Rossuma376cc51996-12-05 23:43:35 +000040
Guido van Rossum37273171996-12-09 18:47:43 +000041#ifdef __sgi
42/* This is missing from unistd.h */
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000043extern void bzero(void *, int);
Guido van Rossum37273171996-12-09 18:47:43 +000044#endif
45
Thomas Wouters0e3f5912006-08-11 14:57:12 +000046#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000047#include <sys/types.h>
Guido van Rossumff7e83d1999-08-27 20:39:37 +000048#endif
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000049
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000050#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000051#include <sys/time.h>
52#include <utils.h>
53#endif
54
Guido van Rossum6f489d91996-06-28 20:15:15 +000055#ifdef MS_WINDOWS
Christian Heimesc36625b2008-01-04 13:33:00 +000056# define WIN32_LEAN_AND_MEAN
Thomas Wouters0e3f5912006-08-11 14:57:12 +000057# include <winsock.h>
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000058#else
Thomas Wouters0e3f5912006-08-11 14:57:12 +000059# define SOCKET int
Skip Montanaroeb33e5a2007-08-17 12:57:41 +000060# if defined(__VMS)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000061# include <socket.h>
62# endif
Guido van Rossumbcc20741998-08-04 22:53:56 +000063#endif
Guido van Rossumed233a51992-06-23 09:07:03 +000064
Barry Warsawc1cb3601996-12-12 22:16:21 +000065/* list of Python objects and their file descriptor */
66typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 PyObject *obj; /* owned reference */
68 SOCKET fd;
69 int sentinel; /* -1 == sentinel */
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000070} pylist;
71
Barry Warsawc1cb3601996-12-12 22:16:21 +000072static void
Tim Peters4b046c22001-08-16 21:59:46 +000073reap_obj(pylist fd2obj[FD_SETSIZE + 1])
Barry Warsawc1cb3601996-12-12 22:16:21 +000074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 int i;
76 for (i = 0; i < FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) {
77 Py_XDECREF(fd2obj[i].obj);
78 fd2obj[i].obj = NULL;
79 }
80 fd2obj[0].sentinel = -1;
Barry Warsawc1cb3601996-12-12 22:16:21 +000081}
82
83
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000084/* returns -1 and sets the Python exception if an error occurred, otherwise
85 returns a number >= 0
86*/
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000087static int
Brett Cannon62dba4c2003-09-10 19:37:42 +000088seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +000089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 int max = -1;
91 int index = 0;
Victor Stinner0fcab4a2011-01-04 12:59:15 +000092 Py_ssize_t i, len = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 PyObject* fast_seq = NULL;
94 PyObject* o = NULL;
Guido van Rossum07432c01995-03-29 16:47:45 +000095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 fd2obj[0].obj = (PyObject*)0; /* set list to zero size */
97 FD_ZERO(set);
Barry Warsawc1cb3601996-12-12 22:16:21 +000098
Benjamin Petersone0edb8b2010-06-27 23:49:45 +000099 fast_seq = PySequence_Fast(seq, "arguments 1-3 must be sequences");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 if (!fast_seq)
101 return -1;
102
103 len = PySequence_Fast_GET_SIZE(fast_seq);
104
105 for (i = 0; i < len; i++) {
106 SOCKET v;
107
108 /* any intervening fileno() calls could decr this refcnt */
109 if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i)))
Brett Cannon62dba4c2003-09-10 19:37:42 +0000110 return -1;
111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 Py_INCREF(o);
113 v = PyObject_AsFileDescriptor( o );
114 if (v == -1) goto finally;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000115
Guido van Rossum947a0fa2000-01-14 16:33:09 +0000116#if defined(_MSC_VER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 max = 0; /* not used for Win32 */
Barry Warsawc1cb3601996-12-12 22:16:21 +0000118#else /* !_MSC_VER */
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200119 if (!_PyIsSelectable_fd(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 PyErr_SetString(PyExc_ValueError,
121 "filedescriptor out of range in select()");
122 goto finally;
123 }
124 if (v > max)
125 max = v;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000126#endif /* _MSC_VER */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 FD_SET(v, set);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 /* add object and its file descriptor to the list */
130 if (index >= FD_SETSIZE) {
131 PyErr_SetString(PyExc_ValueError,
132 "too many file descriptors in select()");
133 goto finally;
134 }
135 fd2obj[index].obj = o;
136 fd2obj[index].fd = v;
137 fd2obj[index].sentinel = 0;
138 fd2obj[++index].sentinel = -1;
139 }
140 Py_DECREF(fast_seq);
141 return max+1;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000142
143 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 Py_XDECREF(o);
145 Py_DECREF(fast_seq);
146 return -1;
Guido van Rossumed233a51992-06-23 09:07:03 +0000147}
148
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000149/* returns NULL and sets the Python exception if an error occurred */
150static PyObject *
Tim Peters4b046c22001-08-16 21:59:46 +0000151set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +0000152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 int i, j, count=0;
154 PyObject *list, *o;
155 SOCKET fd;
Guido van Rossumed233a51992-06-23 09:07:03 +0000156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
158 if (FD_ISSET(fd2obj[j].fd, set))
159 count++;
160 }
161 list = PyList_New(count);
162 if (!list)
163 return NULL;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 i = 0;
166 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
167 fd = fd2obj[j].fd;
168 if (FD_ISSET(fd, set)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 o = fd2obj[j].obj;
170 fd2obj[j].obj = NULL;
171 /* transfer ownership */
172 if (PyList_SetItem(list, i, o) < 0)
173 goto finally;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 i++;
176 }
177 }
178 return list;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000179 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 Py_DECREF(list);
181 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000182}
Barry Warsawc1cb3601996-12-12 22:16:21 +0000183
Barry Warsawb44740f2001-08-16 16:52:59 +0000184#undef SELECT_USES_HEAP
185#if FD_SETSIZE > 1024
186#define SELECT_USES_HEAP
187#endif /* FD_SETSIZE > 1024 */
188
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000189static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000190select_select(PyObject *self, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000191{
Barry Warsawb44740f2001-08-16 16:52:59 +0000192#ifdef SELECT_USES_HEAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 pylist *rfd2obj, *wfd2obj, *efd2obj;
Barry Warsawb44740f2001-08-16 16:52:59 +0000194#else /* !SELECT_USES_HEAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 /* XXX: All this should probably be implemented as follows:
196 * - find the highest descriptor we're interested in
197 * - add one
198 * - that's the size
199 * See: Stevens, APitUE, $12.5.1
200 */
201 pylist rfd2obj[FD_SETSIZE + 1];
202 pylist wfd2obj[FD_SETSIZE + 1];
203 pylist efd2obj[FD_SETSIZE + 1];
Barry Warsawb44740f2001-08-16 16:52:59 +0000204#endif /* SELECT_USES_HEAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 PyObject *ifdlist, *ofdlist, *efdlist;
206 PyObject *ret = NULL;
207 PyObject *tout = Py_None;
208 fd_set ifdset, ofdset, efdset;
209 double timeout;
210 struct timeval tv, *tvp;
211 long seconds;
212 int imax, omax, emax, max;
213 int n;
Guido van Rossumed233a51992-06-23 09:07:03 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 /* convert arguments */
216 if (!PyArg_UnpackTuple(args, "select", 3, 4,
217 &ifdlist, &ofdlist, &efdlist, &tout))
218 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 if (tout == Py_None)
221 tvp = (struct timeval *)0;
222 else if (!PyNumber_Check(tout)) {
223 PyErr_SetString(PyExc_TypeError,
224 "timeout must be a float or None");
225 return NULL;
226 }
227 else {
228 timeout = PyFloat_AsDouble(tout);
229 if (timeout == -1 && PyErr_Occurred())
230 return NULL;
231 if (timeout > (double)LONG_MAX) {
232 PyErr_SetString(PyExc_OverflowError,
233 "timeout period too long");
234 return NULL;
235 }
Antoine Pitrou131a6412011-04-09 23:49:58 +0200236 if (timeout < 0) {
237 PyErr_SetString(PyExc_ValueError,
238 "timeout must be non-negative");
239 return NULL;
240 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 seconds = (long)timeout;
242 timeout = timeout - (double)seconds;
243 tv.tv_sec = seconds;
244 tv.tv_usec = (long)(timeout * 1E6);
245 tvp = &tv;
246 }
Guido van Rossumed233a51992-06-23 09:07:03 +0000247
Guido van Rossumed233a51992-06-23 09:07:03 +0000248
Barry Warsawb44740f2001-08-16 16:52:59 +0000249#ifdef SELECT_USES_HEAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 /* Allocate memory for the lists */
251 rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
252 wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
253 efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
254 if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
255 if (rfd2obj) PyMem_DEL(rfd2obj);
256 if (wfd2obj) PyMem_DEL(wfd2obj);
257 if (efd2obj) PyMem_DEL(efd2obj);
258 return PyErr_NoMemory();
259 }
Barry Warsawb44740f2001-08-16 16:52:59 +0000260#endif /* SELECT_USES_HEAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 /* Convert sequences to fd_sets, and get maximum fd number
262 * propagates the Python exception set in seq2set()
263 */
264 rfd2obj[0].sentinel = -1;
265 wfd2obj[0].sentinel = -1;
266 efd2obj[0].sentinel = -1;
267 if ((imax=seq2set(ifdlist, &ifdset, rfd2obj)) < 0)
268 goto finally;
269 if ((omax=seq2set(ofdlist, &ofdset, wfd2obj)) < 0)
270 goto finally;
271 if ((emax=seq2set(efdlist, &efdset, efd2obj)) < 0)
272 goto finally;
273 max = imax;
274 if (omax > max) max = omax;
275 if (emax > max) max = emax;
Guido van Rossumed233a51992-06-23 09:07:03 +0000276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 Py_BEGIN_ALLOW_THREADS
278 n = select(max, &ifdset, &ofdset, &efdset, tvp);
279 Py_END_ALLOW_THREADS
Guido van Rossumed233a51992-06-23 09:07:03 +0000280
Thomas Heller106f4c72002-09-24 16:51:00 +0000281#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 if (n == SOCKET_ERROR) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200283 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 }
Thomas Heller106f4c72002-09-24 16:51:00 +0000285#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 if (n < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200287 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 }
Thomas Heller106f4c72002-09-24 16:51:00 +0000289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 else {
291 /* any of these three calls can raise an exception. it's more
292 convenient to test for this after all three calls... but
293 is that acceptable?
294 */
295 ifdlist = set2list(&ifdset, rfd2obj);
296 ofdlist = set2list(&ofdset, wfd2obj);
297 efdlist = set2list(&efdset, efd2obj);
298 if (PyErr_Occurred())
299 ret = NULL;
300 else
301 ret = PyTuple_Pack(3, ifdlist, ofdlist, efdlist);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 Py_DECREF(ifdlist);
304 Py_DECREF(ofdlist);
305 Py_DECREF(efdlist);
306 }
307
Barry Warsawc1cb3601996-12-12 22:16:21 +0000308 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 reap_obj(rfd2obj);
310 reap_obj(wfd2obj);
311 reap_obj(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000312#ifdef SELECT_USES_HEAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 PyMem_DEL(rfd2obj);
314 PyMem_DEL(wfd2obj);
315 PyMem_DEL(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000316#endif /* SELECT_USES_HEAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 return ret;
Guido van Rossumed233a51992-06-23 09:07:03 +0000318}
319
Nicholas Bastine62c5c82004-03-21 23:45:42 +0000320#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321/*
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000322 * poll() support
323 */
324
325typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 PyObject_HEAD
327 PyObject *dict;
328 int ufd_uptodate;
329 int ufd_len;
330 struct pollfd *ufds;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000331} pollObject;
332
Jeremy Hylton938ace62002-07-17 16:30:39 +0000333static PyTypeObject poll_Type;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335/* Update the malloc'ed array of pollfds to match the dictionary
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000336 contained within a pollObject. Return 1 on success, 0 on an error.
337*/
338
339static int
340update_ufd_array(pollObject *self)
341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 Py_ssize_t i, pos;
343 PyObject *key, *value;
344 struct pollfd *old_ufds = self->ufds;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 self->ufd_len = PyDict_Size(self->dict);
347 PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len);
348 if (self->ufds == NULL) {
349 self->ufds = old_ufds;
350 PyErr_NoMemory();
351 return 0;
352 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 i = pos = 0;
355 while (PyDict_Next(self->dict, &pos, &key, &value)) {
356 self->ufds[i].fd = PyLong_AsLong(key);
357 self->ufds[i].events = (short)PyLong_AsLong(value);
358 i++;
359 }
360 self->ufd_uptodate = 1;
361 return 1;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000362}
363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000364PyDoc_STRVAR(poll_register_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000365"register(fd [, eventmask] ) -> None\n\n\
366Register a file descriptor with the polling object.\n\
Barry Warsaw2f704552001-08-16 16:55:10 +0000367fd -- either an integer, or an object with a fileno() method returning an\n\
368 int.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000369events -- an optional bitmask describing the type of events to check for");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000370
371static PyObject *
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372poll_register(pollObject *self, PyObject *args)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 PyObject *o, *key, *value;
375 int fd, events = POLLIN | POLLPRI | POLLOUT;
376 int err;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
379 return NULL;
380 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 fd = PyObject_AsFileDescriptor(o);
383 if (fd == -1) return NULL;
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 /* Add entry to the internal dictionary: the key is the
386 file descriptor, and the value is the event mask. */
387 key = PyLong_FromLong(fd);
388 if (key == NULL)
389 return NULL;
390 value = PyLong_FromLong(events);
391 if (value == NULL) {
392 Py_DECREF(key);
393 return NULL;
394 }
395 err = PyDict_SetItem(self->dict, key, value);
396 Py_DECREF(key);
397 Py_DECREF(value);
398 if (err < 0)
399 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 self->ufd_uptodate = 0;
402
403 Py_INCREF(Py_None);
404 return Py_None;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000405}
406
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000407PyDoc_STRVAR(poll_modify_doc,
408"modify(fd, eventmask) -> None\n\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +0000409Modify an already registered file descriptor.\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000410fd -- either an integer, or an object with a fileno() method returning an\n\
411 int.\n\
412events -- an optional bitmask describing the type of events to check for");
413
414static PyObject *
415poll_modify(pollObject *self, PyObject *args)
416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 PyObject *o, *key, *value;
418 int fd, events;
419 int err;
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 if (!PyArg_ParseTuple(args, "Oi:modify", &o, &events)) {
422 return NULL;
423 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 fd = PyObject_AsFileDescriptor(o);
426 if (fd == -1) return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 /* Modify registered fd */
429 key = PyLong_FromLong(fd);
430 if (key == NULL)
431 return NULL;
432 if (PyDict_GetItem(self->dict, key) == NULL) {
433 errno = ENOENT;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200434 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 return NULL;
436 }
437 value = PyLong_FromLong(events);
438 if (value == NULL) {
439 Py_DECREF(key);
440 return NULL;
441 }
442 err = PyDict_SetItem(self->dict, key, value);
443 Py_DECREF(key);
444 Py_DECREF(value);
445 if (err < 0)
446 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 self->ufd_uptodate = 0;
449
450 Py_INCREF(Py_None);
451 return Py_None;
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000452}
453
454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000455PyDoc_STRVAR(poll_unregister_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000456"unregister(fd) -> None\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000457Remove a file descriptor being tracked by the polling object.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000458
459static PyObject *
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460poll_unregister(pollObject *self, PyObject *o)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 PyObject *key;
463 int fd;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 fd = PyObject_AsFileDescriptor( o );
466 if (fd == -1)
467 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 /* Check whether the fd is already in the array */
470 key = PyLong_FromLong(fd);
471 if (key == NULL)
472 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 if (PyDict_DelItem(self->dict, key) == -1) {
475 Py_DECREF(key);
476 /* This will simply raise the KeyError set by PyDict_DelItem
477 if the file descriptor isn't registered. */
478 return NULL;
479 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 Py_DECREF(key);
482 self->ufd_uptodate = 0;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 Py_INCREF(Py_None);
485 return Py_None;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000486}
487
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000488PyDoc_STRVAR(poll_poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000489"poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
490Polls the set of registered file descriptors, returning a list containing \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000491any descriptors that have events or errors to report.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000492
493static PyObject *
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494poll_poll(pollObject *self, PyObject *args)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 PyObject *result_list = NULL, *tout = NULL;
497 int timeout = 0, poll_result, i, j;
498 PyObject *value = NULL, *num = NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
501 return NULL;
502 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 /* Check values for timeout */
505 if (tout == NULL || tout == Py_None)
506 timeout = -1;
507 else if (!PyNumber_Check(tout)) {
508 PyErr_SetString(PyExc_TypeError,
509 "timeout must be an integer or None");
510 return NULL;
511 }
512 else {
513 tout = PyNumber_Long(tout);
514 if (!tout)
515 return NULL;
516 timeout = PyLong_AsLong(tout);
517 Py_DECREF(tout);
518 if (timeout == -1 && PyErr_Occurred())
519 return NULL;
520 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 /* Ensure the ufd array is up to date */
523 if (!self->ufd_uptodate)
524 if (update_ufd_array(self) == 0)
525 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 /* call poll() */
528 Py_BEGIN_ALLOW_THREADS
529 poll_result = poll(self->ufds, self->ufd_len, timeout);
530 Py_END_ALLOW_THREADS
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 if (poll_result < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200533 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 return NULL;
535 }
536
537 /* build the result list */
538
539 result_list = PyList_New(poll_result);
540 if (!result_list)
541 return NULL;
542 else {
543 for (i = 0, j = 0; j < poll_result; j++) {
544 /* skip to the next fired descriptor */
545 while (!self->ufds[i].revents) {
546 i++;
547 }
548 /* if we hit a NULL return, set value to NULL
549 and break out of loop; code at end will
550 clean up result_list */
551 value = PyTuple_New(2);
552 if (value == NULL)
553 goto error;
554 num = PyLong_FromLong(self->ufds[i].fd);
555 if (num == NULL) {
556 Py_DECREF(value);
557 goto error;
558 }
559 PyTuple_SET_ITEM(value, 0, num);
560
561 /* The &0xffff is a workaround for AIX. 'revents'
562 is a 16-bit short, and IBM assigned POLLNVAL
563 to be 0x8000, so the conversion to int results
564 in a negative number. See SF bug #923315. */
565 num = PyLong_FromLong(self->ufds[i].revents & 0xffff);
566 if (num == NULL) {
567 Py_DECREF(value);
568 goto error;
569 }
570 PyTuple_SET_ITEM(value, 1, num);
571 if ((PyList_SetItem(result_list, j, value)) == -1) {
572 Py_DECREF(value);
573 goto error;
574 }
575 i++;
576 }
577 }
578 return result_list;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000579
580 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 Py_DECREF(result_list);
582 return NULL;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000583}
584
585static PyMethodDef poll_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 {"register", (PyCFunction)poll_register,
587 METH_VARARGS, poll_register_doc},
588 {"modify", (PyCFunction)poll_modify,
589 METH_VARARGS, poll_modify_doc},
590 {"unregister", (PyCFunction)poll_unregister,
591 METH_O, poll_unregister_doc},
592 {"poll", (PyCFunction)poll_poll,
593 METH_VARARGS, poll_poll_doc},
594 {NULL, NULL} /* sentinel */
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000595};
596
597static pollObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000598newPollObject(void)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 pollObject *self;
601 self = PyObject_New(pollObject, &poll_Type);
602 if (self == NULL)
603 return NULL;
604 /* ufd_uptodate is a Boolean, denoting whether the
605 array pointed to by ufds matches the contents of the dictionary. */
606 self->ufd_uptodate = 0;
607 self->ufds = NULL;
608 self->dict = PyDict_New();
609 if (self->dict == NULL) {
610 Py_DECREF(self);
611 return NULL;
612 }
613 return self;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000614}
615
616static void
617poll_dealloc(pollObject *self)
618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 if (self->ufds != NULL)
620 PyMem_DEL(self->ufds);
621 Py_XDECREF(self->dict);
622 PyObject_Del(self);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000623}
624
Tim Peters0c322792002-07-17 16:49:03 +0000625static PyTypeObject poll_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 /* The ob_type field must be initialized in the module init function
627 * to be portable to Windows without using C++. */
628 PyVarObject_HEAD_INIT(NULL, 0)
629 "select.poll", /*tp_name*/
630 sizeof(pollObject), /*tp_basicsize*/
631 0, /*tp_itemsize*/
632 /* methods */
633 (destructor)poll_dealloc, /*tp_dealloc*/
634 0, /*tp_print*/
635 0, /*tp_getattr*/
636 0, /*tp_setattr*/
637 0, /*tp_reserved*/
638 0, /*tp_repr*/
639 0, /*tp_as_number*/
640 0, /*tp_as_sequence*/
641 0, /*tp_as_mapping*/
642 0, /*tp_hash*/
643 0, /*tp_call*/
644 0, /*tp_str*/
645 0, /*tp_getattro*/
646 0, /*tp_setattro*/
647 0, /*tp_as_buffer*/
648 Py_TPFLAGS_DEFAULT, /*tp_flags*/
649 0, /*tp_doc*/
650 0, /*tp_traverse*/
651 0, /*tp_clear*/
652 0, /*tp_richcompare*/
653 0, /*tp_weaklistoffset*/
654 0, /*tp_iter*/
655 0, /*tp_iternext*/
656 poll_methods, /*tp_methods*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000657};
658
Jesus Cead8b9ae62011-11-14 19:07:41 +0100659#ifdef HAVE_SYS_DEVPOLL_H
660typedef struct {
661 PyObject_HEAD
662 int fd_devpoll;
663 int max_n_fds;
664 int n_fds;
665 struct pollfd *fds;
666} devpollObject;
667
668static PyTypeObject devpoll_Type;
669
670static int devpoll_flush(devpollObject *self)
671{
672 int size, n;
673
674 if (!self->n_fds) return 0;
675
676 size = sizeof(struct pollfd)*self->n_fds;
677 self->n_fds = 0;
678
679 Py_BEGIN_ALLOW_THREADS
680 n = write(self->fd_devpoll, self->fds, size);
681 Py_END_ALLOW_THREADS
682
683 if (n == -1 ) {
684 PyErr_SetFromErrno(PyExc_IOError);
685 return -1;
686 }
687 if (n < size) {
688 /*
689 ** Data writed to /dev/poll is a binary data structure. It is not
690 ** clear what to do if a partial write occurred. For now, raise
691 ** an exception and see if we actually found this problem in
692 ** the wild.
693 ** See http://bugs.python.org/issue6397.
694 */
695 PyErr_Format(PyExc_IOError, "failed to write all pollfds. "
696 "Please, report at http://bugs.python.org/. "
697 "Data to report: Size tried: %d, actual size written: %d.",
698 size, n);
699 return -1;
700 }
701 return 0;
702}
703
704static PyObject *
705internal_devpoll_register(devpollObject *self, PyObject *args, int remove)
706{
707 PyObject *o;
708 int fd, events = POLLIN | POLLPRI | POLLOUT;
709
710 if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
711 return NULL;
712 }
713
714 fd = PyObject_AsFileDescriptor(o);
715 if (fd == -1) return NULL;
716
717 if (remove) {
718 self->fds[self->n_fds].fd = fd;
719 self->fds[self->n_fds].events = POLLREMOVE;
720
721 if (++self->n_fds == self->max_n_fds) {
722 if (devpoll_flush(self))
723 return NULL;
724 }
725 }
726
727 self->fds[self->n_fds].fd = fd;
728 self->fds[self->n_fds].events = events;
729
730 if (++self->n_fds == self->max_n_fds) {
731 if (devpoll_flush(self))
732 return NULL;
733 }
734
735 Py_RETURN_NONE;
736}
737
738PyDoc_STRVAR(devpoll_register_doc,
739"register(fd [, eventmask] ) -> None\n\n\
740Register a file descriptor with the polling object.\n\
741fd -- either an integer, or an object with a fileno() method returning an\n\
742 int.\n\
743events -- an optional bitmask describing the type of events to check for");
744
745static PyObject *
746devpoll_register(devpollObject *self, PyObject *args)
747{
748 return internal_devpoll_register(self, args, 0);
749}
750
751PyDoc_STRVAR(devpoll_modify_doc,
752"modify(fd[, eventmask]) -> None\n\n\
753Modify a possible already registered file descriptor.\n\
754fd -- either an integer, or an object with a fileno() method returning an\n\
755 int.\n\
756events -- an optional bitmask describing the type of events to check for");
757
758static PyObject *
759devpoll_modify(devpollObject *self, PyObject *args)
760{
761 return internal_devpoll_register(self, args, 1);
762}
763
764
765PyDoc_STRVAR(devpoll_unregister_doc,
766"unregister(fd) -> None\n\n\
767Remove a file descriptor being tracked by the polling object.");
768
769static PyObject *
770devpoll_unregister(devpollObject *self, PyObject *o)
771{
772 int fd;
773
774 fd = PyObject_AsFileDescriptor( o );
775 if (fd == -1)
776 return NULL;
777
778 self->fds[self->n_fds].fd = fd;
779 self->fds[self->n_fds].events = POLLREMOVE;
780
781 if (++self->n_fds == self->max_n_fds) {
782 if (devpoll_flush(self))
783 return NULL;
784 }
785
786 Py_RETURN_NONE;
787}
788
789PyDoc_STRVAR(devpoll_poll_doc,
790"poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
791Polls the set of registered file descriptors, returning a list containing \n\
792any descriptors that have events or errors to report.");
793
794static PyObject *
795devpoll_poll(devpollObject *self, PyObject *args)
796{
797 struct dvpoll dvp;
798 PyObject *result_list = NULL, *tout = NULL;
799 int poll_result, i;
800 long timeout;
801 PyObject *value, *num1, *num2;
802
803 if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
804 return NULL;
805 }
806
807 /* Check values for timeout */
808 if (tout == NULL || tout == Py_None)
809 timeout = -1;
810 else if (!PyNumber_Check(tout)) {
811 PyErr_SetString(PyExc_TypeError,
812 "timeout must be an integer or None");
813 return NULL;
814 }
815 else {
816 tout = PyNumber_Long(tout);
817 if (!tout)
818 return NULL;
819 timeout = PyLong_AsLong(tout);
820 Py_DECREF(tout);
821 if (timeout == -1 && PyErr_Occurred())
822 return NULL;
823 }
824
825 if ((timeout < -1) || (timeout > INT_MAX)) {
826 PyErr_SetString(PyExc_OverflowError,
827 "timeout is out of range");
828 return NULL;
829 }
830
831 if (devpoll_flush(self))
832 return NULL;
833
834 dvp.dp_fds = self->fds;
835 dvp.dp_nfds = self->max_n_fds;
836 dvp.dp_timeout = timeout;
837
838 /* call devpoll() */
839 Py_BEGIN_ALLOW_THREADS
840 poll_result = ioctl(self->fd_devpoll, DP_POLL, &dvp);
841 Py_END_ALLOW_THREADS
842
843 if (poll_result < 0) {
844 PyErr_SetFromErrno(PyExc_IOError);
845 return NULL;
846 }
847
848 /* build the result list */
849
850 result_list = PyList_New(poll_result);
851 if (!result_list)
852 return NULL;
853 else {
854 for (i = 0; i < poll_result; i++) {
855 num1 = PyLong_FromLong(self->fds[i].fd);
856 num2 = PyLong_FromLong(self->fds[i].revents);
857 if ((num1 == NULL) || (num2 == NULL)) {
858 Py_XDECREF(num1);
859 Py_XDECREF(num2);
860 goto error;
861 }
862 value = PyTuple_Pack(2, num1, num2);
863 Py_DECREF(num1);
864 Py_DECREF(num2);
865 if (value == NULL)
866 goto error;
867 if ((PyList_SetItem(result_list, i, value)) == -1) {
868 Py_DECREF(value);
869 goto error;
870 }
871 }
872 }
873
874 return result_list;
875
876 error:
877 Py_DECREF(result_list);
878 return NULL;
879}
880
881static PyMethodDef devpoll_methods[] = {
882 {"register", (PyCFunction)devpoll_register,
883 METH_VARARGS, devpoll_register_doc},
884 {"modify", (PyCFunction)devpoll_modify,
885 METH_VARARGS, devpoll_modify_doc},
886 {"unregister", (PyCFunction)devpoll_unregister,
887 METH_O, devpoll_unregister_doc},
888 {"poll", (PyCFunction)devpoll_poll,
889 METH_VARARGS, devpoll_poll_doc},
890 {NULL, NULL} /* sentinel */
891};
892
893static devpollObject *
894newDevPollObject(void)
895{
896 devpollObject *self;
897 int fd_devpoll, limit_result;
898 struct pollfd *fds;
899 struct rlimit limit;
900
901 Py_BEGIN_ALLOW_THREADS
902 /*
903 ** If we try to process more that getrlimit()
904 ** fds, the kernel will give an error, so
905 ** we set the limit here. It is a dynamic
906 ** value, because we can change rlimit() anytime.
907 */
908 limit_result = getrlimit(RLIMIT_NOFILE, &limit);
909 if (limit_result != -1)
910 fd_devpoll = open("/dev/poll", O_RDWR);
911 Py_END_ALLOW_THREADS
912
913 if (limit_result == -1) {
914 PyErr_SetFromErrno(PyExc_OSError);
915 return NULL;
916 }
917 if (fd_devpoll == -1) {
918 PyErr_SetFromErrnoWithFilename(PyExc_IOError, "/dev/poll");
919 return NULL;
920 }
921
922 fds = PyMem_NEW(struct pollfd, limit.rlim_cur);
923 if (fds == NULL) {
924 close(fd_devpoll);
925 PyErr_NoMemory();
926 return NULL;
927 }
928
929 self = PyObject_New(devpollObject, &devpoll_Type);
930 if (self == NULL) {
931 close(fd_devpoll);
932 PyMem_DEL(fds);
933 return NULL;
934 }
935 self->fd_devpoll = fd_devpoll;
936 self->max_n_fds = limit.rlim_cur;
937 self->n_fds = 0;
938 self->fds = fds;
939
940 return self;
941}
942
943static void
944devpoll_dealloc(devpollObject *self)
945{
946 Py_BEGIN_ALLOW_THREADS
947 close(self->fd_devpoll);
948 Py_END_ALLOW_THREADS
949
950 PyMem_DEL(self->fds);
951
952 PyObject_Del(self);
953}
954
955static PyTypeObject devpoll_Type = {
956 /* The ob_type field must be initialized in the module init function
957 * to be portable to Windows without using C++. */
958 PyVarObject_HEAD_INIT(NULL, 0)
959 "select.devpoll", /*tp_name*/
960 sizeof(devpollObject), /*tp_basicsize*/
961 0, /*tp_itemsize*/
962 /* methods */
963 (destructor)devpoll_dealloc, /*tp_dealloc*/
964 0, /*tp_print*/
965 0, /*tp_getattr*/
966 0, /*tp_setattr*/
967 0, /*tp_reserved*/
968 0, /*tp_repr*/
969 0, /*tp_as_number*/
970 0, /*tp_as_sequence*/
971 0, /*tp_as_mapping*/
972 0, /*tp_hash*/
973 0, /*tp_call*/
974 0, /*tp_str*/
975 0, /*tp_getattro*/
976 0, /*tp_setattro*/
977 0, /*tp_as_buffer*/
978 Py_TPFLAGS_DEFAULT, /*tp_flags*/
979 0, /*tp_doc*/
980 0, /*tp_traverse*/
981 0, /*tp_clear*/
982 0, /*tp_richcompare*/
983 0, /*tp_weaklistoffset*/
984 0, /*tp_iter*/
985 0, /*tp_iternext*/
986 devpoll_methods, /*tp_methods*/
987};
988#endif /* HAVE_SYS_DEVPOLL_H */
989
990
991
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000992PyDoc_STRVAR(poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000993"Returns a polling object, which supports registering and\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000994unregistering file descriptors, and then polling them for I/O events.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000995
996static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000997select_poll(PyObject *self, PyObject *unused)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 return (PyObject *)newPollObject();
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +00001000}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001001
Jesus Cead8b9ae62011-11-14 19:07:41 +01001002#ifdef HAVE_SYS_DEVPOLL_H
1003PyDoc_STRVAR(devpoll_doc,
1004"Returns a polling object, which supports registering and\n\
1005unregistering file descriptors, and then polling them for I/O events.");
1006
1007static PyObject *
1008select_devpoll(PyObject *self, PyObject *unused)
1009{
1010 return (PyObject *)newDevPollObject();
1011}
1012#endif
1013
1014
Thomas Wouters477c8d52006-05-27 19:21:47 +00001015#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016/*
Thomas Wouters477c8d52006-05-27 19:21:47 +00001017 * On some systems poll() sets errno on invalid file descriptors. We test
1018 * for this at runtime because this bug may be fixed or introduced between
1019 * OS releases.
1020 */
1021static int select_have_broken_poll(void)
1022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 int poll_test;
1024 int filedes[2];
Thomas Wouters477c8d52006-05-27 19:21:47 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 };
Thomas Wouters477c8d52006-05-27 19:21:47 +00001027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 /* Create a file descriptor to make invalid */
1029 if (pipe(filedes) < 0) {
1030 return 1;
1031 }
1032 poll_struct.fd = filedes[0];
1033 close(filedes[0]);
1034 close(filedes[1]);
1035 poll_test = poll(&poll_struct, 1, 0);
1036 if (poll_test < 0) {
1037 return 1;
1038 } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) {
1039 return 1;
1040 }
1041 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001042}
1043#endif /* __APPLE__ */
1044
1045#endif /* HAVE_POLL */
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +00001046
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001047#ifdef HAVE_EPOLL
1048/* **************************************************************************
1049 * epoll interface for Linux 2.6
1050 *
1051 * Written by Christian Heimes
1052 * Inspired by Twisted's _epoll.pyx and select.poll()
1053 */
1054
1055#ifdef HAVE_SYS_EPOLL_H
1056#include <sys/epoll.h>
1057#endif
1058
1059typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 PyObject_HEAD
1061 SOCKET epfd; /* epoll control file descriptor */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001062} pyEpoll_Object;
1063
1064static PyTypeObject pyEpoll_Type;
1065#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type))
1066
1067static PyObject *
1068pyepoll_err_closed(void)
1069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 PyErr_SetString(PyExc_ValueError, "I/O operation on closed epoll fd");
1071 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001072}
1073
1074static int
1075pyepoll_internal_close(pyEpoll_Object *self)
1076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 int save_errno = 0;
1078 if (self->epfd >= 0) {
1079 int epfd = self->epfd;
1080 self->epfd = -1;
1081 Py_BEGIN_ALLOW_THREADS
1082 if (close(epfd) < 0)
1083 save_errno = errno;
1084 Py_END_ALLOW_THREADS
1085 }
1086 return save_errno;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001087}
1088
1089static PyObject *
Benjamin Peterson95c16622011-12-27 15:36:32 -06001090newPyEpoll_Object(PyTypeObject *type, int sizehint, int flags, SOCKET fd)
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 pyEpoll_Object *self;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 assert(type != NULL && type->tp_alloc != NULL);
1095 self = (pyEpoll_Object *) type->tp_alloc(type, 0);
1096 if (self == NULL)
1097 return NULL;
1098
1099 if (fd == -1) {
1100 Py_BEGIN_ALLOW_THREADS
Benjamin Peterson95c16622011-12-27 15:36:32 -06001101#ifdef HAVE_EPOLL_CREATE1
Benjamin Peterson83251c12011-12-27 16:01:21 -06001102 if (flags)
1103 self->epfd = epoll_create1(flags);
1104 else
Benjamin Peterson95c16622011-12-27 15:36:32 -06001105#endif
Benjamin Peterson83251c12011-12-27 16:01:21 -06001106 self->epfd = epoll_create(sizehint);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 Py_END_ALLOW_THREADS
1108 }
1109 else {
1110 self->epfd = fd;
1111 }
1112 if (self->epfd < 0) {
1113 Py_DECREF(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001114 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 return NULL;
1116 }
1117 return (PyObject *)self;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001118}
1119
1120
1121static PyObject *
1122pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1123{
Benjamin Peterson83251c12011-12-27 16:01:21 -06001124 int flags = 0, sizehint = FD_SETSIZE - 1;
Benjamin Peterson2fb9ae92011-12-27 15:15:41 -06001125 static char *kwlist[] = {"sizehint", "flags", NULL};
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001126
Benjamin Peterson2fb9ae92011-12-27 15:15:41 -06001127 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:epoll", kwlist,
1128 &sizehint, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 return NULL;
Benjamin Peterson2fb9ae92011-12-27 15:15:41 -06001130 if (sizehint < 0) {
1131 PyErr_SetString(PyExc_ValueError, "negative sizehint");
1132 return NULL;
1133 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001134
Benjamin Peterson95c16622011-12-27 15:36:32 -06001135 return newPyEpoll_Object(type, sizehint, flags, -1);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001136}
1137
1138
1139static void
1140pyepoll_dealloc(pyEpoll_Object *self)
1141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 (void)pyepoll_internal_close(self);
1143 Py_TYPE(self)->tp_free(self);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001144}
1145
1146static PyObject*
1147pyepoll_close(pyEpoll_Object *self)
1148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 errno = pyepoll_internal_close(self);
1150 if (errno < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001151 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 return NULL;
1153 }
1154 Py_RETURN_NONE;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001155}
1156
1157PyDoc_STRVAR(pyepoll_close_doc,
1158"close() -> None\n\
1159\n\
1160Close the epoll control file descriptor. Further operations on the epoll\n\
1161object will raise an exception.");
1162
1163static PyObject*
1164pyepoll_get_closed(pyEpoll_Object *self)
1165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 if (self->epfd < 0)
1167 Py_RETURN_TRUE;
1168 else
1169 Py_RETURN_FALSE;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001170}
1171
1172static PyObject*
1173pyepoll_fileno(pyEpoll_Object *self)
1174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 if (self->epfd < 0)
1176 return pyepoll_err_closed();
1177 return PyLong_FromLong(self->epfd);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001178}
1179
1180PyDoc_STRVAR(pyepoll_fileno_doc,
1181"fileno() -> int\n\
1182\n\
1183Return the epoll control file descriptor.");
1184
1185static PyObject*
1186pyepoll_fromfd(PyObject *cls, PyObject *args)
1187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 SOCKET fd;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
1191 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001192
Benjamin Peterson95c16622011-12-27 15:36:32 -06001193 return newPyEpoll_Object((PyTypeObject*)cls, FD_SETSIZE - 1, 0, fd);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001194}
1195
1196PyDoc_STRVAR(pyepoll_fromfd_doc,
1197"fromfd(fd) -> epoll\n\
1198\n\
1199Create an epoll object from a given control fd.");
1200
1201static PyObject *
1202pyepoll_internal_ctl(int epfd, int op, PyObject *pfd, unsigned int events)
1203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 struct epoll_event ev;
1205 int result;
1206 int fd;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 if (epfd < 0)
1209 return pyepoll_err_closed();
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 fd = PyObject_AsFileDescriptor(pfd);
1212 if (fd == -1) {
1213 return NULL;
1214 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 switch(op) {
1217 case EPOLL_CTL_ADD:
1218 case EPOLL_CTL_MOD:
1219 ev.events = events;
1220 ev.data.fd = fd;
1221 Py_BEGIN_ALLOW_THREADS
1222 result = epoll_ctl(epfd, op, fd, &ev);
1223 Py_END_ALLOW_THREADS
1224 break;
1225 case EPOLL_CTL_DEL:
1226 /* In kernel versions before 2.6.9, the EPOLL_CTL_DEL
1227 * operation required a non-NULL pointer in event, even
1228 * though this argument is ignored. */
1229 Py_BEGIN_ALLOW_THREADS
1230 result = epoll_ctl(epfd, op, fd, &ev);
1231 if (errno == EBADF) {
1232 /* fd already closed */
1233 result = 0;
1234 errno = 0;
1235 }
1236 Py_END_ALLOW_THREADS
1237 break;
1238 default:
1239 result = -1;
1240 errno = EINVAL;
1241 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 if (result < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001244 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 return NULL;
1246 }
1247 Py_RETURN_NONE;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001248}
1249
1250static PyObject *
1251pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
1252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 PyObject *pfd;
1254 unsigned int events = EPOLLIN | EPOLLOUT | EPOLLPRI;
1255 static char *kwlist[] = {"fd", "eventmask", NULL};
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|I:register", kwlist,
1258 &pfd, &events)) {
1259 return NULL;
1260 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_ADD, pfd, events);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001263}
1264
1265PyDoc_STRVAR(pyepoll_register_doc,
Georg Brandl222569d2010-08-02 20:47:56 +00001266"register(fd[, eventmask]) -> None\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001267\n\
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001268Registers a new fd or raises an OSError if the fd is already registered.\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +00001269fd is the target file descriptor of the operation.\n\
1270events is a bit set composed of the various EPOLL constants; the default\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001271is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
1272\n\
1273The epoll interface supports all file descriptors that support poll.");
1274
1275static PyObject *
1276pyepoll_modify(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
1277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 PyObject *pfd;
1279 unsigned int events;
1280 static char *kwlist[] = {"fd", "eventmask", NULL};
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OI:modify", kwlist,
1283 &pfd, &events)) {
1284 return NULL;
1285 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_MOD, pfd, events);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001288}
1289
1290PyDoc_STRVAR(pyepoll_modify_doc,
1291"modify(fd, eventmask) -> None\n\
1292\n\
1293fd is the target file descriptor of the operation\n\
1294events is a bit set composed of the various EPOLL constants");
1295
1296static PyObject *
1297pyepoll_unregister(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
1298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 PyObject *pfd;
1300 static char *kwlist[] = {"fd", NULL};
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:unregister", kwlist,
1303 &pfd)) {
1304 return NULL;
1305 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_DEL, pfd, 0);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001308}
1309
1310PyDoc_STRVAR(pyepoll_unregister_doc,
1311"unregister(fd) -> None\n\
1312\n\
1313fd is the target file descriptor of the operation.");
1314
1315static PyObject *
1316pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
1317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 double dtimeout = -1.;
1319 int timeout;
1320 int maxevents = -1;
1321 int nfds, i;
1322 PyObject *elist = NULL, *etuple = NULL;
1323 struct epoll_event *evs = NULL;
1324 static char *kwlist[] = {"timeout", "maxevents", NULL};
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 if (self->epfd < 0)
1327 return pyepoll_err_closed();
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|di:poll", kwlist,
1330 &dtimeout, &maxevents)) {
1331 return NULL;
1332 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 if (dtimeout < 0) {
1335 timeout = -1;
1336 }
1337 else if (dtimeout * 1000.0 > INT_MAX) {
1338 PyErr_SetString(PyExc_OverflowError,
1339 "timeout is too large");
1340 return NULL;
1341 }
1342 else {
1343 timeout = (int)(dtimeout * 1000.0);
1344 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 if (maxevents == -1) {
1347 maxevents = FD_SETSIZE-1;
1348 }
1349 else if (maxevents < 1) {
1350 PyErr_Format(PyExc_ValueError,
1351 "maxevents must be greater than 0, got %d",
1352 maxevents);
1353 return NULL;
1354 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 evs = PyMem_New(struct epoll_event, maxevents);
1357 if (evs == NULL) {
1358 Py_DECREF(self);
1359 PyErr_NoMemory();
1360 return NULL;
1361 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 Py_BEGIN_ALLOW_THREADS
1364 nfds = epoll_wait(self->epfd, evs, maxevents, timeout);
1365 Py_END_ALLOW_THREADS
1366 if (nfds < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001367 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 goto error;
1369 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 elist = PyList_New(nfds);
1372 if (elist == NULL) {
1373 goto error;
1374 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 for (i = 0; i < nfds; i++) {
1377 etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events);
1378 if (etuple == NULL) {
1379 Py_CLEAR(elist);
1380 goto error;
1381 }
1382 PyList_SET_ITEM(elist, i, etuple);
1383 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001384
Christian Heimesf6cd9672008-03-26 13:45:42 +00001385 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 PyMem_Free(evs);
1387 return elist;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001388}
1389
1390PyDoc_STRVAR(pyepoll_poll_doc,
1391"poll([timeout=-1[, maxevents=-1]]) -> [(fd, events), (...)]\n\
1392\n\
1393Wait for events on the epoll file descriptor for a maximum time of timeout\n\
1394in seconds (as float). -1 makes poll wait indefinitely.\n\
1395Up to maxevents are returned to the caller.");
1396
1397static PyMethodDef pyepoll_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 {"fromfd", (PyCFunction)pyepoll_fromfd,
1399 METH_VARARGS | METH_CLASS, pyepoll_fromfd_doc},
1400 {"close", (PyCFunction)pyepoll_close, METH_NOARGS,
1401 pyepoll_close_doc},
1402 {"fileno", (PyCFunction)pyepoll_fileno, METH_NOARGS,
1403 pyepoll_fileno_doc},
1404 {"modify", (PyCFunction)pyepoll_modify,
1405 METH_VARARGS | METH_KEYWORDS, pyepoll_modify_doc},
1406 {"register", (PyCFunction)pyepoll_register,
1407 METH_VARARGS | METH_KEYWORDS, pyepoll_register_doc},
1408 {"unregister", (PyCFunction)pyepoll_unregister,
1409 METH_VARARGS | METH_KEYWORDS, pyepoll_unregister_doc},
1410 {"poll", (PyCFunction)pyepoll_poll,
1411 METH_VARARGS | METH_KEYWORDS, pyepoll_poll_doc},
1412 {NULL, NULL},
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001413};
1414
1415static PyGetSetDef pyepoll_getsetlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 {"closed", (getter)pyepoll_get_closed, NULL,
1417 "True if the epoll handler is closed"},
1418 {0},
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001419};
1420
1421PyDoc_STRVAR(pyepoll_doc,
Benjamin Peterson2fb9ae92011-12-27 15:15:41 -06001422"select.epoll(sizehint=-1, flags=0)\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001423\n\
1424Returns an epolling object\n\
1425\n\
1426sizehint must be a positive integer or -1 for the default size. The\n\
1427sizehint is used to optimize internal data structures. It doesn't limit\n\
1428the maximum number of monitored events.");
1429
1430static PyTypeObject pyEpoll_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 PyVarObject_HEAD_INIT(NULL, 0)
1432 "select.epoll", /* tp_name */
1433 sizeof(pyEpoll_Object), /* tp_basicsize */
1434 0, /* tp_itemsize */
1435 (destructor)pyepoll_dealloc, /* tp_dealloc */
1436 0, /* tp_print */
1437 0, /* tp_getattr */
1438 0, /* tp_setattr */
1439 0, /* tp_reserved */
1440 0, /* tp_repr */
1441 0, /* tp_as_number */
1442 0, /* tp_as_sequence */
1443 0, /* tp_as_mapping */
1444 0, /* tp_hash */
1445 0, /* tp_call */
1446 0, /* tp_str */
1447 PyObject_GenericGetAttr, /* tp_getattro */
1448 0, /* tp_setattro */
1449 0, /* tp_as_buffer */
1450 Py_TPFLAGS_DEFAULT, /* tp_flags */
1451 pyepoll_doc, /* tp_doc */
1452 0, /* tp_traverse */
1453 0, /* tp_clear */
1454 0, /* tp_richcompare */
1455 0, /* tp_weaklistoffset */
1456 0, /* tp_iter */
1457 0, /* tp_iternext */
1458 pyepoll_methods, /* tp_methods */
1459 0, /* tp_members */
1460 pyepoll_getsetlist, /* tp_getset */
1461 0, /* tp_base */
1462 0, /* tp_dict */
1463 0, /* tp_descr_get */
1464 0, /* tp_descr_set */
1465 0, /* tp_dictoffset */
1466 0, /* tp_init */
1467 0, /* tp_alloc */
1468 pyepoll_new, /* tp_new */
1469 0, /* tp_free */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001470};
1471
1472#endif /* HAVE_EPOLL */
1473
1474#ifdef HAVE_KQUEUE
1475/* **************************************************************************
1476 * kqueue interface for BSD
1477 *
1478 * Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
1479 * All rights reserved.
1480 *
1481 * Redistribution and use in source and binary forms, with or without
1482 * modification, are permitted provided that the following conditions
1483 * are met:
1484 * 1. Redistributions of source code must retain the above copyright
1485 * notice, this list of conditions and the following disclaimer.
1486 * 2. Redistributions in binary form must reproduce the above copyright
1487 * notice, this list of conditions and the following disclaimer in the
1488 * documentation and/or other materials provided with the distribution.
1489 *
1490 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1491 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1492 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1493 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1494 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1495 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1496 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1497 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1498 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1499 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1500 * SUCH DAMAGE.
1501 */
1502
1503#ifdef HAVE_SYS_EVENT_H
1504#include <sys/event.h>
1505#endif
1506
1507PyDoc_STRVAR(kqueue_event_doc,
Benjamin Peterson1baf4652009-12-31 03:11:23 +00001508"kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001509\n\
1510This object is the equivalent of the struct kevent for the C API.\n\
1511\n\
1512See the kqueue manpage for more detailed information about the meaning\n\
1513of the arguments.\n\
1514\n\
1515One minor note: while you might hope that udata could store a\n\
1516reference to a python object, it cannot, because it is impossible to\n\
1517keep a proper reference count of the object once it's passed into the\n\
1518kernel. Therefore, I have restricted it to only storing an integer. I\n\
1519recommend ignoring it and simply using the 'ident' field to key off\n\
1520of. You could also set up a dictionary on the python side to store a\n\
1521udata->object mapping.");
1522
1523typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 PyObject_HEAD
1525 struct kevent e;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001526} kqueue_event_Object;
1527
1528static PyTypeObject kqueue_event_Type;
1529
1530#define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type))
1531
1532typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 PyObject_HEAD
1534 SOCKET kqfd; /* kqueue control fd */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001535} kqueue_queue_Object;
1536
1537static PyTypeObject kqueue_queue_Type;
1538
1539#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type))
1540
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001541#if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P)
1542# error uintptr_t does not match void *!
1543#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG)
1544# define T_UINTPTRT T_ULONGLONG
1545# define T_INTPTRT T_LONGLONG
1546# define PyLong_AsUintptr_t PyLong_AsUnsignedLongLong
1547# define UINTPTRT_FMT_UNIT "K"
1548# define INTPTRT_FMT_UNIT "L"
1549#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG)
1550# define T_UINTPTRT T_ULONG
1551# define T_INTPTRT T_LONG
1552# define PyLong_AsUintptr_t PyLong_AsUnsignedLong
1553# define UINTPTRT_FMT_UNIT "k"
1554# define INTPTRT_FMT_UNIT "l"
1555#elif (SIZEOF_UINTPTR_T == SIZEOF_INT)
1556# define T_UINTPTRT T_UINT
1557# define T_INTPTRT T_INT
1558# define PyLong_AsUintptr_t PyLong_AsUnsignedLong
1559# define UINTPTRT_FMT_UNIT "I"
1560# define INTPTRT_FMT_UNIT "i"
1561#else
1562# error uintptr_t does not match int, long, or long long!
1563#endif
1564
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001565/* Unfortunately, we can't store python objects in udata, because
1566 * kevents in the kernel can be removed without warning, which would
1567 * forever lose the refcount on the object stored with it.
1568 */
1569
1570#define KQ_OFF(x) offsetof(kqueue_event_Object, x)
1571static struct PyMemberDef kqueue_event_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 {"ident", T_UINTPTRT, KQ_OFF(e.ident)},
1573 {"filter", T_SHORT, KQ_OFF(e.filter)},
1574 {"flags", T_USHORT, KQ_OFF(e.flags)},
1575 {"fflags", T_UINT, KQ_OFF(e.fflags)},
1576 {"data", T_INTPTRT, KQ_OFF(e.data)},
1577 {"udata", T_UINTPTRT, KQ_OFF(e.udata)},
1578 {NULL} /* Sentinel */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001579};
1580#undef KQ_OFF
1581
1582static PyObject *
Georg Brandlc0e22b72010-03-14 10:51:01 +00001583
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001584kqueue_event_repr(kqueue_event_Object *s)
1585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 char buf[1024];
1587 PyOS_snprintf(
1588 buf, sizeof(buf),
1589 "<select.kevent ident=%zu filter=%d flags=0x%x fflags=0x%x "
1590 "data=0x%zd udata=%p>",
1591 (size_t)(s->e.ident), s->e.filter, s->e.flags,
1592 s->e.fflags, (Py_ssize_t)(s->e.data), s->e.udata);
1593 return PyUnicode_FromString(buf);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001594}
1595
1596static int
1597kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds)
1598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 PyObject *pfd;
1600 static char *kwlist[] = {"ident", "filter", "flags", "fflags",
1601 "data", "udata", NULL};
1602 static char *fmt = "O|hhi" INTPTRT_FMT_UNIT UINTPTRT_FMT_UNIT ":kevent";
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist,
1607 &pfd, &(self->e.filter), &(self->e.flags),
1608 &(self->e.fflags), &(self->e.data), &(self->e.udata))) {
1609 return -1;
1610 }
1611
1612 if (PyLong_Check(pfd)) {
1613 self->e.ident = PyLong_AsUintptr_t(pfd);
1614 }
1615 else {
1616 self->e.ident = PyObject_AsFileDescriptor(pfd);
1617 }
1618 if (PyErr_Occurred()) {
1619 return -1;
1620 }
1621 return 0;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001622}
1623
1624static PyObject *
1625kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 int op)
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 Py_intptr_t result = 0;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 if (!kqueue_event_Check(o)) {
1631 if (op == Py_EQ || op == Py_NE) {
1632 PyObject *res = op == Py_EQ ? Py_False : Py_True;
1633 Py_INCREF(res);
1634 return res;
1635 }
1636 PyErr_Format(PyExc_TypeError,
1637 "can't compare %.200s to %.200s",
1638 Py_TYPE(s)->tp_name, Py_TYPE(o)->tp_name);
1639 return NULL;
1640 }
1641 if (((result = s->e.ident - o->e.ident) == 0) &&
1642 ((result = s->e.filter - o->e.filter) == 0) &&
1643 ((result = s->e.flags - o->e.flags) == 0) &&
1644 ((result = s->e.fflags - o->e.fflags) == 0) &&
1645 ((result = s->e.data - o->e.data) == 0) &&
1646 ((result = s->e.udata - o->e.udata) == 0)
1647 ) {
1648 result = 0;
1649 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 switch (op) {
1652 case Py_EQ:
1653 result = (result == 0);
1654 break;
1655 case Py_NE:
1656 result = (result != 0);
1657 break;
1658 case Py_LE:
1659 result = (result <= 0);
1660 break;
1661 case Py_GE:
1662 result = (result >= 0);
1663 break;
1664 case Py_LT:
1665 result = (result < 0);
1666 break;
1667 case Py_GT:
1668 result = (result > 0);
1669 break;
1670 }
1671 return PyBool_FromLong((long)result);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001672}
1673
1674static PyTypeObject kqueue_event_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 PyVarObject_HEAD_INIT(NULL, 0)
1676 "select.kevent", /* tp_name */
1677 sizeof(kqueue_event_Object), /* tp_basicsize */
1678 0, /* tp_itemsize */
1679 0, /* tp_dealloc */
1680 0, /* tp_print */
1681 0, /* tp_getattr */
1682 0, /* tp_setattr */
1683 0, /* tp_reserved */
1684 (reprfunc)kqueue_event_repr, /* tp_repr */
1685 0, /* tp_as_number */
1686 0, /* tp_as_sequence */
1687 0, /* tp_as_mapping */
1688 0, /* tp_hash */
1689 0, /* tp_call */
1690 0, /* tp_str */
1691 0, /* tp_getattro */
1692 0, /* tp_setattro */
1693 0, /* tp_as_buffer */
1694 Py_TPFLAGS_DEFAULT, /* tp_flags */
1695 kqueue_event_doc, /* tp_doc */
1696 0, /* tp_traverse */
1697 0, /* tp_clear */
1698 (richcmpfunc)kqueue_event_richcompare, /* tp_richcompare */
1699 0, /* tp_weaklistoffset */
1700 0, /* tp_iter */
1701 0, /* tp_iternext */
1702 0, /* tp_methods */
1703 kqueue_event_members, /* tp_members */
1704 0, /* tp_getset */
1705 0, /* tp_base */
1706 0, /* tp_dict */
1707 0, /* tp_descr_get */
1708 0, /* tp_descr_set */
1709 0, /* tp_dictoffset */
1710 (initproc)kqueue_event_init, /* tp_init */
1711 0, /* tp_alloc */
1712 0, /* tp_new */
1713 0, /* tp_free */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001714};
1715
1716static PyObject *
1717kqueue_queue_err_closed(void)
1718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 PyErr_SetString(PyExc_ValueError, "I/O operation on closed kqueue fd");
1720 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001721}
1722
1723static int
1724kqueue_queue_internal_close(kqueue_queue_Object *self)
1725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 int save_errno = 0;
1727 if (self->kqfd >= 0) {
1728 int kqfd = self->kqfd;
1729 self->kqfd = -1;
1730 Py_BEGIN_ALLOW_THREADS
1731 if (close(kqfd) < 0)
1732 save_errno = errno;
1733 Py_END_ALLOW_THREADS
1734 }
1735 return save_errno;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001736}
1737
1738static PyObject *
1739newKqueue_Object(PyTypeObject *type, SOCKET fd)
1740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 kqueue_queue_Object *self;
1742 assert(type != NULL && type->tp_alloc != NULL);
1743 self = (kqueue_queue_Object *) type->tp_alloc(type, 0);
1744 if (self == NULL) {
1745 return NULL;
1746 }
1747
1748 if (fd == -1) {
1749 Py_BEGIN_ALLOW_THREADS
1750 self->kqfd = kqueue();
1751 Py_END_ALLOW_THREADS
1752 }
1753 else {
1754 self->kqfd = fd;
1755 }
1756 if (self->kqfd < 0) {
1757 Py_DECREF(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001758 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 return NULL;
1760 }
1761 return (PyObject *)self;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001762}
1763
1764static PyObject *
1765kqueue_queue_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1766{
1767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 if ((args != NULL && PyObject_Size(args)) ||
1769 (kwds != NULL && PyObject_Size(kwds))) {
1770 PyErr_SetString(PyExc_ValueError,
1771 "select.kqueue doesn't accept arguments");
1772 return NULL;
1773 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 return newKqueue_Object(type, -1);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001776}
1777
1778static void
1779kqueue_queue_dealloc(kqueue_queue_Object *self)
1780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 kqueue_queue_internal_close(self);
1782 Py_TYPE(self)->tp_free(self);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001783}
1784
1785static PyObject*
1786kqueue_queue_close(kqueue_queue_Object *self)
1787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 errno = kqueue_queue_internal_close(self);
1789 if (errno < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001790 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 return NULL;
1792 }
1793 Py_RETURN_NONE;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001794}
1795
1796PyDoc_STRVAR(kqueue_queue_close_doc,
1797"close() -> None\n\
1798\n\
1799Close the kqueue control file descriptor. Further operations on the kqueue\n\
1800object will raise an exception.");
1801
1802static PyObject*
1803kqueue_queue_get_closed(kqueue_queue_Object *self)
1804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 if (self->kqfd < 0)
1806 Py_RETURN_TRUE;
1807 else
1808 Py_RETURN_FALSE;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001809}
1810
1811static PyObject*
1812kqueue_queue_fileno(kqueue_queue_Object *self)
1813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 if (self->kqfd < 0)
1815 return kqueue_queue_err_closed();
1816 return PyLong_FromLong(self->kqfd);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001817}
1818
1819PyDoc_STRVAR(kqueue_queue_fileno_doc,
1820"fileno() -> int\n\
1821\n\
1822Return the kqueue control file descriptor.");
1823
1824static PyObject*
1825kqueue_queue_fromfd(PyObject *cls, PyObject *args)
1826{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 SOCKET fd;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
1830 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 return newKqueue_Object((PyTypeObject*)cls, fd);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001833}
1834
1835PyDoc_STRVAR(kqueue_queue_fromfd_doc,
1836"fromfd(fd) -> kqueue\n\
1837\n\
1838Create a kqueue object from a given control fd.");
1839
1840static PyObject *
1841kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
1842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 int nevents = 0;
1844 int gotevents = 0;
1845 int nchanges = 0;
1846 int i = 0;
1847 PyObject *otimeout = NULL;
1848 PyObject *ch = NULL;
1849 PyObject *it = NULL, *ei = NULL;
1850 PyObject *result = NULL;
1851 struct kevent *evl = NULL;
1852 struct kevent *chl = NULL;
1853 struct timespec timeoutspec;
1854 struct timespec *ptimeoutspec;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 if (self->kqfd < 0)
1857 return kqueue_queue_err_closed();
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 if (!PyArg_ParseTuple(args, "Oi|O:control", &ch, &nevents, &otimeout))
1860 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 if (nevents < 0) {
1863 PyErr_Format(PyExc_ValueError,
1864 "Length of eventlist must be 0 or positive, got %d",
1865 nevents);
1866 return NULL;
1867 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 if (otimeout == Py_None || otimeout == NULL) {
1870 ptimeoutspec = NULL;
1871 }
1872 else if (PyNumber_Check(otimeout)) {
1873 double timeout;
1874 long seconds;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 timeout = PyFloat_AsDouble(otimeout);
1877 if (timeout == -1 && PyErr_Occurred())
1878 return NULL;
1879 if (timeout > (double)LONG_MAX) {
1880 PyErr_SetString(PyExc_OverflowError,
1881 "timeout period too long");
1882 return NULL;
1883 }
1884 if (timeout < 0) {
1885 PyErr_SetString(PyExc_ValueError,
1886 "timeout must be positive or None");
1887 return NULL;
1888 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 seconds = (long)timeout;
1891 timeout = timeout - (double)seconds;
1892 timeoutspec.tv_sec = seconds;
1893 timeoutspec.tv_nsec = (long)(timeout * 1E9);
1894 ptimeoutspec = &timeoutspec;
1895 }
1896 else {
1897 PyErr_Format(PyExc_TypeError,
1898 "timeout argument must be an number "
1899 "or None, got %.200s",
1900 Py_TYPE(otimeout)->tp_name);
1901 return NULL;
1902 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 if (ch != NULL && ch != Py_None) {
1905 it = PyObject_GetIter(ch);
1906 if (it == NULL) {
1907 PyErr_SetString(PyExc_TypeError,
1908 "changelist is not iterable");
1909 return NULL;
1910 }
1911 nchanges = PyObject_Size(ch);
1912 if (nchanges < 0) {
1913 goto error;
1914 }
Georg Brandlc0e22b72010-03-14 10:51:01 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 chl = PyMem_New(struct kevent, nchanges);
1917 if (chl == NULL) {
1918 PyErr_NoMemory();
1919 goto error;
1920 }
1921 i = 0;
1922 while ((ei = PyIter_Next(it)) != NULL) {
1923 if (!kqueue_event_Check(ei)) {
1924 Py_DECREF(ei);
1925 PyErr_SetString(PyExc_TypeError,
1926 "changelist must be an iterable of "
1927 "select.kevent objects");
1928 goto error;
1929 } else {
1930 chl[i++] = ((kqueue_event_Object *)ei)->e;
1931 }
1932 Py_DECREF(ei);
1933 }
1934 }
1935 Py_CLEAR(it);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 /* event list */
1938 if (nevents) {
1939 evl = PyMem_New(struct kevent, nevents);
1940 if (evl == NULL) {
1941 PyErr_NoMemory();
1942 goto error;
1943 }
1944 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 Py_BEGIN_ALLOW_THREADS
1947 gotevents = kevent(self->kqfd, chl, nchanges,
1948 evl, nevents, ptimeoutspec);
1949 Py_END_ALLOW_THREADS
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 if (gotevents == -1) {
1952 PyErr_SetFromErrno(PyExc_OSError);
1953 goto error;
1954 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 result = PyList_New(gotevents);
1957 if (result == NULL) {
1958 goto error;
1959 }
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 for (i = 0; i < gotevents; i++) {
1962 kqueue_event_Object *ch;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type);
1965 if (ch == NULL) {
1966 goto error;
1967 }
1968 ch->e = evl[i];
1969 PyList_SET_ITEM(result, i, (PyObject *)ch);
1970 }
1971 PyMem_Free(chl);
1972 PyMem_Free(evl);
1973 return result;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001974
1975 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 PyMem_Free(chl);
1977 PyMem_Free(evl);
1978 Py_XDECREF(result);
1979 Py_XDECREF(it);
1980 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001981}
1982
1983PyDoc_STRVAR(kqueue_queue_control_doc,
Benjamin Peterson9bc93512008-09-22 22:10:59 +00001984"control(changelist, max_events[, timeout=None]) -> eventlist\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001985\n\
1986Calls the kernel kevent function.\n\
1987- changelist must be a list of kevent objects describing the changes\n\
1988 to be made to the kernel's watch list or None.\n\
1989- max_events lets you specify the maximum number of events that the\n\
1990 kernel will return.\n\
1991- timeout is the maximum time to wait in seconds, or else None,\n\
1992 to wait forever. timeout accepts floats for smaller timeouts, too.");
1993
1994
1995static PyMethodDef kqueue_queue_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 {"fromfd", (PyCFunction)kqueue_queue_fromfd,
1997 METH_VARARGS | METH_CLASS, kqueue_queue_fromfd_doc},
1998 {"close", (PyCFunction)kqueue_queue_close, METH_NOARGS,
1999 kqueue_queue_close_doc},
2000 {"fileno", (PyCFunction)kqueue_queue_fileno, METH_NOARGS,
2001 kqueue_queue_fileno_doc},
2002 {"control", (PyCFunction)kqueue_queue_control,
2003 METH_VARARGS , kqueue_queue_control_doc},
2004 {NULL, NULL},
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002005};
2006
2007static PyGetSetDef kqueue_queue_getsetlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 {"closed", (getter)kqueue_queue_get_closed, NULL,
2009 "True if the kqueue handler is closed"},
2010 {0},
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002011};
2012
2013PyDoc_STRVAR(kqueue_queue_doc,
2014"Kqueue syscall wrapper.\n\
2015\n\
2016For example, to start watching a socket for input:\n\
2017>>> kq = kqueue()\n\
2018>>> sock = socket()\n\
2019>>> sock.connect((host, port))\n\
2020>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_ADD)], 0)\n\
2021\n\
2022To wait one second for it to become writeable:\n\
2023>>> kq.control(None, 1, 1000)\n\
2024\n\
2025To stop listening:\n\
2026>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_DELETE)], 0)");
2027
2028static PyTypeObject kqueue_queue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 PyVarObject_HEAD_INIT(NULL, 0)
2030 "select.kqueue", /* tp_name */
2031 sizeof(kqueue_queue_Object), /* tp_basicsize */
2032 0, /* tp_itemsize */
2033 (destructor)kqueue_queue_dealloc, /* tp_dealloc */
2034 0, /* tp_print */
2035 0, /* tp_getattr */
2036 0, /* tp_setattr */
2037 0, /* tp_reserved */
2038 0, /* tp_repr */
2039 0, /* tp_as_number */
2040 0, /* tp_as_sequence */
2041 0, /* tp_as_mapping */
2042 0, /* tp_hash */
2043 0, /* tp_call */
2044 0, /* tp_str */
2045 0, /* tp_getattro */
2046 0, /* tp_setattro */
2047 0, /* tp_as_buffer */
2048 Py_TPFLAGS_DEFAULT, /* tp_flags */
2049 kqueue_queue_doc, /* tp_doc */
2050 0, /* tp_traverse */
2051 0, /* tp_clear */
2052 0, /* tp_richcompare */
2053 0, /* tp_weaklistoffset */
2054 0, /* tp_iter */
2055 0, /* tp_iternext */
2056 kqueue_queue_methods, /* tp_methods */
2057 0, /* tp_members */
2058 kqueue_queue_getsetlist, /* tp_getset */
2059 0, /* tp_base */
2060 0, /* tp_dict */
2061 0, /* tp_descr_get */
2062 0, /* tp_descr_set */
2063 0, /* tp_dictoffset */
2064 0, /* tp_init */
2065 0, /* tp_alloc */
2066 kqueue_queue_new, /* tp_new */
2067 0, /* tp_free */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002068};
2069
2070#endif /* HAVE_KQUEUE */
Jesus Cead8b9ae62011-11-14 19:07:41 +01002071
2072
2073
2074
2075
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002076/* ************************************************************************ */
2077
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002078PyDoc_STRVAR(select_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00002079"select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
2080\n\
2081Wait until one or more file descriptors are ready for some kind of I/O.\n\
Brett Cannon62dba4c2003-09-10 19:37:42 +00002082The first three arguments are sequences of file descriptors to be waited for:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00002083rlist -- wait until ready for reading\n\
2084wlist -- wait until ready for writing\n\
2085xlist -- wait for an ``exceptional condition''\n\
2086If only one kind of condition is required, pass [] for the other lists.\n\
2087A file descriptor is either a socket or file object, or a small integer\n\
2088gotten from a fileno() method call on one of those.\n\
2089\n\
2090The optional 4th argument specifies a timeout in seconds; it may be\n\
2091a floating point number to specify fractions of seconds. If it is absent\n\
2092or None, the call will never time out.\n\
2093\n\
2094The return value is a tuple of three lists corresponding to the first three\n\
2095arguments; each contains the subset of the corresponding file descriptors\n\
2096that are ready.\n\
2097\n\
2098*** IMPORTANT NOTICE ***\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002099On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +00002100descriptors can be used.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00002101
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00002102static PyMethodDef select_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 {"select", select_select, METH_VARARGS, select_doc},
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002104#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 {"poll", select_poll, METH_NOARGS, poll_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002106#endif /* HAVE_POLL */
Jesus Cead8b9ae62011-11-14 19:07:41 +01002107#ifdef HAVE_SYS_DEVPOLL_H
2108 {"devpoll", select_devpoll, METH_NOARGS, devpoll_doc},
2109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 {0, 0}, /* sentinel */
Guido van Rossumed233a51992-06-23 09:07:03 +00002111};
2112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002113PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00002114"This module supports asynchronous I/O on multiple file descriptors.\n\
2115\n\
2116*** IMPORTANT NOTICE ***\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002117On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.");
Guido van Rossumed233a51992-06-23 09:07:03 +00002118
Martin v. Löwis1a214512008-06-11 05:26:20 +00002119
2120static struct PyModuleDef selectmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 PyModuleDef_HEAD_INIT,
2122 "select",
2123 module_doc,
2124 -1,
2125 select_methods,
2126 NULL,
2127 NULL,
2128 NULL,
2129 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002130};
2131
Jesus Cead8b9ae62011-11-14 19:07:41 +01002132
2133
2134
Mark Hammond62b1ab12002-07-23 06:31:15 +00002135PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002136PyInit_select(void)
Guido van Rossumed233a51992-06-23 09:07:03 +00002137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 PyObject *m;
2139 m = PyModule_Create(&selectmodule);
2140 if (m == NULL)
2141 return NULL;
Fred Drake4baedc12002-04-01 14:53:37 +00002142
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002143 Py_INCREF(PyExc_OSError);
2144 PyModule_AddObject(m, "error", PyExc_OSError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002145
Amaury Forgeot d'Arcace31022009-07-09 22:44:11 +00002146#ifdef PIPE_BUF
R. David Murraye16cda92010-10-15 23:12:57 +00002147#ifdef HAVE_BROKEN_PIPE_BUF
2148#undef PIPE_BUF
2149#define PIPE_BUF 512
2150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 PyModule_AddIntConstant(m, "PIPE_BUF", PIPE_BUF);
Amaury Forgeot d'Arcace31022009-07-09 22:44:11 +00002152#endif
Gregory P. Smithb970b862009-07-04 02:28:47 +00002153
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002154#if defined(HAVE_POLL)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002155#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 if (select_have_broken_poll()) {
2157 if (PyObject_DelAttrString(m, "poll") == -1) {
2158 PyErr_Clear();
2159 }
2160 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002161#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 if (PyType_Ready(&poll_Type) < 0)
2165 return NULL;
2166 PyModule_AddIntConstant(m, "POLLIN", POLLIN);
2167 PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
2168 PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
2169 PyModule_AddIntConstant(m, "POLLERR", POLLERR);
2170 PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
2171 PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +00002172
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00002173#ifdef POLLRDNORM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00002175#endif
2176#ifdef POLLRDBAND
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00002178#endif
2179#ifdef POLLWRNORM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00002181#endif
2182#ifdef POLLWRBAND
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00002184#endif
Sjoerd Mullender239f8362000-08-25 13:59:18 +00002185#ifdef POLLMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
Sjoerd Mullender239f8362000-08-25 13:59:18 +00002187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002189#endif /* HAVE_POLL */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002190
Jesus Cead8b9ae62011-11-14 19:07:41 +01002191#ifdef HAVE_SYS_DEVPOLL_H
2192 if (PyType_Ready(&devpoll_Type) < 0)
2193 return NULL;
2194#endif
2195
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002196#ifdef HAVE_EPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 Py_TYPE(&pyEpoll_Type) = &PyType_Type;
2198 if (PyType_Ready(&pyEpoll_Type) < 0)
2199 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 Py_INCREF(&pyEpoll_Type);
2202 PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 PyModule_AddIntConstant(m, "EPOLLIN", EPOLLIN);
2205 PyModule_AddIntConstant(m, "EPOLLOUT", EPOLLOUT);
2206 PyModule_AddIntConstant(m, "EPOLLPRI", EPOLLPRI);
2207 PyModule_AddIntConstant(m, "EPOLLERR", EPOLLERR);
2208 PyModule_AddIntConstant(m, "EPOLLHUP", EPOLLHUP);
2209 PyModule_AddIntConstant(m, "EPOLLET", EPOLLET);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002210#ifdef EPOLLONESHOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 /* Kernel 2.6.2+ */
2212 PyModule_AddIntConstant(m, "EPOLLONESHOT", EPOLLONESHOT);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 /* PyModule_AddIntConstant(m, "EPOLL_RDHUP", EPOLLRDHUP); */
2215 PyModule_AddIntConstant(m, "EPOLLRDNORM", EPOLLRDNORM);
2216 PyModule_AddIntConstant(m, "EPOLLRDBAND", EPOLLRDBAND);
2217 PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
2218 PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
2219 PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
Benjamin Peterson2fb9ae92011-12-27 15:15:41 -06002220
Benjamin Peterson95c16622011-12-27 15:36:32 -06002221#ifdef EPOLL_CLOEXEC
Benjamin Peterson2fb9ae92011-12-27 15:15:41 -06002222 PyModule_AddIntConstant(m, "EPOLL_CLOEXEC", EPOLL_CLOEXEC);
Benjamin Peterson95c16622011-12-27 15:36:32 -06002223#endif
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002224#endif /* HAVE_EPOLL */
2225
2226#ifdef HAVE_KQUEUE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 kqueue_event_Type.tp_new = PyType_GenericNew;
2228 Py_TYPE(&kqueue_event_Type) = &PyType_Type;
2229 if(PyType_Ready(&kqueue_event_Type) < 0)
2230 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 Py_INCREF(&kqueue_event_Type);
2233 PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 Py_TYPE(&kqueue_queue_Type) = &PyType_Type;
2236 if(PyType_Ready(&kqueue_queue_Type) < 0)
2237 return NULL;
2238 Py_INCREF(&kqueue_queue_Type);
2239 PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type);
2240
2241 /* event filters */
2242 PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
2243 PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE);
2244 PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO);
2245 PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE);
2246 PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002247#ifdef EVFILT_NETDEV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
2251 PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 /* event flags */
2254 PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD);
2255 PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE);
2256 PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE);
2257 PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE);
2258 PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT);
2259 PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS);
2262 PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF);
2265 PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 /* READ WRITE filter flag */
2268 PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 /* VNODE filter flags */
2271 PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE);
2272 PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE);
2273 PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND);
2274 PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB);
2275 PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK);
2276 PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME);
2277 PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 /* PROC filter flags */
2280 PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT);
2281 PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK);
2282 PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC);
2283 PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
2284 PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK);
2287 PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD);
2288 PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR);
2289
2290 /* NETDEV filter flags */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002291#ifdef EVFILT_NETDEV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP);
2293 PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
2294 PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00002295#endif
2296
2297#endif /* HAVE_KQUEUE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 return m;
Guido van Rossumed233a51992-06-23 09:07:03 +00002299}