blob: daabf03ac2347428626b07a3a343a9f3529e8e55 [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
Thomas Wouters477c8d52006-05-27 19:21:47 +000010#ifdef __APPLE__
11 /* Perform runtime testing for a broken poll on OSX to make it easier
12 * to use the same binary on multiple releases of the OS.
13 */
14#undef HAVE_BROKEN_POLL
15#endif
16
Tim Petersd92dfe02000-12-12 01:18:41 +000017/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
18 64 is too small (too many people have bumped into that limit).
19 Here we boost it.
20 Users who want even more than the boosted limit should #define
21 FD_SETSIZE higher before this; e.g., via compiler /D switch.
22*/
23#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
24#define FD_SETSIZE 512
25#endif
26
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000027#if defined(HAVE_POLL_H)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000028#include <poll.h>
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000029#elif defined(HAVE_SYS_POLL_H)
30#include <sys/poll.h>
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000031#endif
Guido van Rossuma376cc51996-12-05 23:43:35 +000032
Guido van Rossum37273171996-12-09 18:47:43 +000033#ifdef __sgi
34/* This is missing from unistd.h */
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000035extern void bzero(void *, int);
Guido van Rossum37273171996-12-09 18:47:43 +000036#endif
37
Thomas Wouters0e3f5912006-08-11 14:57:12 +000038#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000039#include <sys/types.h>
Guido van Rossumff7e83d1999-08-27 20:39:37 +000040#endif
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000041
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000042#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000043#include <sys/time.h>
44#include <utils.h>
45#endif
46
Guido van Rossum6f489d91996-06-28 20:15:15 +000047#ifdef MS_WINDOWS
Christian Heimesc36625b2008-01-04 13:33:00 +000048# define WIN32_LEAN_AND_MEAN
Thomas Wouters0e3f5912006-08-11 14:57:12 +000049# include <winsock.h>
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000050#else
Thomas Wouters0e3f5912006-08-11 14:57:12 +000051# define SOCKET int
Skip Montanaroeb33e5a2007-08-17 12:57:41 +000052# if defined(__VMS)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000053# include <socket.h>
54# endif
Guido van Rossumbcc20741998-08-04 22:53:56 +000055#endif
Guido van Rossumed233a51992-06-23 09:07:03 +000056
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000057static PyObject *SelectError;
Guido van Rossumed233a51992-06-23 09:07:03 +000058
Barry Warsawc1cb3601996-12-12 22:16:21 +000059/* list of Python objects and their file descriptor */
60typedef struct {
61 PyObject *obj; /* owned reference */
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000062 SOCKET fd;
Barry Warsawc1cb3601996-12-12 22:16:21 +000063 int sentinel; /* -1 == sentinel */
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000064} pylist;
65
Barry Warsawc1cb3601996-12-12 22:16:21 +000066static void
Tim Peters4b046c22001-08-16 21:59:46 +000067reap_obj(pylist fd2obj[FD_SETSIZE + 1])
Barry Warsawc1cb3601996-12-12 22:16:21 +000068{
69 int i;
Tim Peters4b046c22001-08-16 21:59:46 +000070 for (i = 0; i < FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) {
Barry Warsawc1cb3601996-12-12 22:16:21 +000071 Py_XDECREF(fd2obj[i].obj);
72 fd2obj[i].obj = NULL;
73 }
74 fd2obj[0].sentinel = -1;
75}
76
77
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000078/* returns -1 and sets the Python exception if an error occurred, otherwise
79 returns a number >= 0
80*/
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000081static int
Brett Cannon62dba4c2003-09-10 19:37:42 +000082seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +000083{
Barry Warsawc1cb3601996-12-12 22:16:21 +000084 int i;
85 int max = -1;
86 int index = 0;
Brett Cannon62dba4c2003-09-10 19:37:42 +000087 int len = -1;
88 PyObject* fast_seq = NULL;
Barry Warsawc1cb3601996-12-12 22:16:21 +000089 PyObject* o = NULL;
Guido van Rossum07432c01995-03-29 16:47:45 +000090
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000091 fd2obj[0].obj = (PyObject*)0; /* set list to zero size */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000092 FD_ZERO(set);
Barry Warsawc1cb3601996-12-12 22:16:21 +000093
Brett Cannon62dba4c2003-09-10 19:37:42 +000094 fast_seq=PySequence_Fast(seq, "arguments 1-3 must be sequences");
95 if (!fast_seq)
96 return -1;
97
98 len = PySequence_Fast_GET_SIZE(fast_seq);
99
Barry Warsawc1cb3601996-12-12 22:16:21 +0000100 for (i = 0; i < len; i++) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000101 SOCKET v;
102
103 /* any intervening fileno() calls could decr this refcnt */
Brett Cannon62dba4c2003-09-10 19:37:42 +0000104 if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i)))
Barry Warsaw529fcfe1996-12-16 18:15:34 +0000105 return -1;
Barry Warsaw24c4b3d1996-12-13 23:22:42 +0000106
Barry Warsawc1cb3601996-12-12 22:16:21 +0000107 Py_INCREF(o);
Andrew M. Kuchling9f28a032000-07-13 23:59:35 +0000108 v = PyObject_AsFileDescriptor( o );
109 if (v == -1) goto finally;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000110
Guido van Rossum947a0fa2000-01-14 16:33:09 +0000111#if defined(_MSC_VER)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000112 max = 0; /* not used for Win32 */
113#else /* !_MSC_VER */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000114 if (v < 0 || v >= FD_SETSIZE) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000115 PyErr_SetString(PyExc_ValueError,
116 "filedescriptor out of range in select()");
117 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000118 }
119 if (v > max)
120 max = v;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000121#endif /* _MSC_VER */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000122 FD_SET(v, set);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000123
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000124 /* add object and its file descriptor to the list */
125 if (index >= FD_SETSIZE) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000126 PyErr_SetString(PyExc_ValueError,
127 "too many file descriptors in select()");
128 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000129 }
130 fd2obj[index].obj = o;
131 fd2obj[index].fd = v;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000132 fd2obj[index].sentinel = 0;
133 fd2obj[++index].sentinel = -1;
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000134 }
Brett Cannon62dba4c2003-09-10 19:37:42 +0000135 Py_DECREF(fast_seq);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000136 return max+1;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000137
138 finally:
139 Py_XDECREF(o);
Brett Cannon62dba4c2003-09-10 19:37:42 +0000140 Py_DECREF(fast_seq);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000141 return -1;
Guido van Rossumed233a51992-06-23 09:07:03 +0000142}
143
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000144/* returns NULL and sets the Python exception if an error occurred */
145static PyObject *
Tim Peters4b046c22001-08-16 21:59:46 +0000146set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +0000147{
Barry Warsawc1cb3601996-12-12 22:16:21 +0000148 int i, j, count=0;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000149 PyObject *list, *o;
150 SOCKET fd;
Guido van Rossumed233a51992-06-23 09:07:03 +0000151
Barry Warsawc1cb3601996-12-12 22:16:21 +0000152 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000153 if (FD_ISSET(fd2obj[j].fd, set))
Barry Warsawc1cb3601996-12-12 22:16:21 +0000154 count++;
155 }
156 list = PyList_New(count);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000157 if (!list)
158 return NULL;
159
Barry Warsawc1cb3601996-12-12 22:16:21 +0000160 i = 0;
161 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000162 fd = fd2obj[j].fd;
163 if (FD_ISSET(fd, set)) {
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000164#ifndef _MSC_VER
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000165 if (fd > FD_SETSIZE) {
166 PyErr_SetString(PyExc_SystemError,
167 "filedescriptor out of range returned in select()");
Barry Warsawc1cb3601996-12-12 22:16:21 +0000168 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000169 }
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000170#endif
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000171 o = fd2obj[j].obj;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000172 fd2obj[j].obj = NULL;
173 /* transfer ownership */
174 if (PyList_SetItem(list, i, o) < 0)
175 goto finally;
176
177 i++;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000178 }
179 }
180 return list;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000181 finally:
182 Py_DECREF(list);
183 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000184}
Barry Warsawc1cb3601996-12-12 22:16:21 +0000185
Barry Warsawb44740f2001-08-16 16:52:59 +0000186#undef SELECT_USES_HEAP
187#if FD_SETSIZE > 1024
188#define SELECT_USES_HEAP
189#endif /* FD_SETSIZE > 1024 */
190
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000191static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000192select_select(PyObject *self, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000193{
Barry Warsawb44740f2001-08-16 16:52:59 +0000194#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000195 pylist *rfd2obj, *wfd2obj, *efd2obj;
Barry Warsawb44740f2001-08-16 16:52:59 +0000196#else /* !SELECT_USES_HEAP */
Tim Peters4b046c22001-08-16 21:59:46 +0000197 /* XXX: All this should probably be implemented as follows:
Barry Warsawb44740f2001-08-16 16:52:59 +0000198 * - find the highest descriptor we're interested in
199 * - add one
200 * - that's the size
201 * See: Stevens, APitUE, $12.5.1
202 */
Tim Peters4b046c22001-08-16 21:59:46 +0000203 pylist rfd2obj[FD_SETSIZE + 1];
204 pylist wfd2obj[FD_SETSIZE + 1];
205 pylist efd2obj[FD_SETSIZE + 1];
Barry Warsawb44740f2001-08-16 16:52:59 +0000206#endif /* SELECT_USES_HEAP */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000207 PyObject *ifdlist, *ofdlist, *efdlist;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000208 PyObject *ret = NULL;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000209 PyObject *tout = Py_None;
210 fd_set ifdset, ofdset, efdset;
211 double timeout;
212 struct timeval tv, *tvp;
Guido van Rossum3262e162000-06-28 21:18:13 +0000213 long seconds;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000214 int imax, omax, emax, max;
215 int n;
Guido van Rossumed233a51992-06-23 09:07:03 +0000216
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000217 /* convert arguments */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000218 if (!PyArg_UnpackTuple(args, "select", 3, 4,
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000219 &ifdlist, &ofdlist, &efdlist, &tout))
220 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000221
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000222 if (tout == Py_None)
223 tvp = (struct timeval *)0;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000224 else if (!PyNumber_Check(tout)) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000225 PyErr_SetString(PyExc_TypeError,
226 "timeout must be a float or None");
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000227 return NULL;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000228 }
Guido van Rossumc7a22701993-11-01 16:27:16 +0000229 else {
Neil Schemenauer47ec6c02002-11-18 16:02:29 +0000230 timeout = PyFloat_AsDouble(tout);
231 if (timeout == -1 && PyErr_Occurred())
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000232 return NULL;
Guido van Rossum3262e162000-06-28 21:18:13 +0000233 if (timeout > (double)LONG_MAX) {
Barry Warsaw2f704552001-08-16 16:55:10 +0000234 PyErr_SetString(PyExc_OverflowError,
235 "timeout period too long");
Guido van Rossum3262e162000-06-28 21:18:13 +0000236 return NULL;
237 }
238 seconds = (long)timeout;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000239 timeout = timeout - (double)seconds;
240 tv.tv_sec = seconds;
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000241 tv.tv_usec = (long)(timeout * 1E6);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000242 tvp = &tv;
Guido van Rossumc7a22701993-11-01 16:27:16 +0000243 }
Guido van Rossumed233a51992-06-23 09:07:03 +0000244
Guido van Rossumed233a51992-06-23 09:07:03 +0000245
Barry Warsawb44740f2001-08-16 16:52:59 +0000246#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000247 /* Allocate memory for the lists */
Tim Peters4b046c22001-08-16 21:59:46 +0000248 rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
249 wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
250 efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
Guido van Rossumd20781b1998-07-02 02:53:36 +0000251 if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000252 if (rfd2obj) PyMem_DEL(rfd2obj);
253 if (wfd2obj) PyMem_DEL(wfd2obj);
254 if (efd2obj) PyMem_DEL(efd2obj);
Tim Peters5f322d32003-02-11 17:18:58 +0000255 return PyErr_NoMemory();
Guido van Rossumd20781b1998-07-02 02:53:36 +0000256 }
Barry Warsawb44740f2001-08-16 16:52:59 +0000257#endif /* SELECT_USES_HEAP */
Brett Cannon62dba4c2003-09-10 19:37:42 +0000258 /* Convert sequences to fd_sets, and get maximum fd number
259 * propagates the Python exception set in seq2set()
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000260 */
Barry Warsawc1cb3601996-12-12 22:16:21 +0000261 rfd2obj[0].sentinel = -1;
262 wfd2obj[0].sentinel = -1;
263 efd2obj[0].sentinel = -1;
Brett Cannon62dba4c2003-09-10 19:37:42 +0000264 if ((imax=seq2set(ifdlist, &ifdset, rfd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000265 goto finally;
Brett Cannon62dba4c2003-09-10 19:37:42 +0000266 if ((omax=seq2set(ofdlist, &ofdset, wfd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000267 goto finally;
Brett Cannon62dba4c2003-09-10 19:37:42 +0000268 if ((emax=seq2set(efdlist, &efdset, efd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000269 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000270 max = imax;
271 if (omax > max) max = omax;
272 if (emax > max) max = emax;
Guido van Rossumed233a51992-06-23 09:07:03 +0000273
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000274 Py_BEGIN_ALLOW_THREADS
275 n = select(max, &ifdset, &ofdset, &efdset, tvp);
276 Py_END_ALLOW_THREADS
Guido van Rossumed233a51992-06-23 09:07:03 +0000277
Thomas Heller106f4c72002-09-24 16:51:00 +0000278#ifdef MS_WINDOWS
279 if (n == SOCKET_ERROR) {
280 PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError());
281 }
282#else
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000283 if (n < 0) {
284 PyErr_SetFromErrno(SelectError);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000285 }
Thomas Heller106f4c72002-09-24 16:51:00 +0000286#endif
Barry Warsawc1cb3601996-12-12 22:16:21 +0000287 else if (n == 0) {
288 /* optimization */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000289 ifdlist = PyList_New(0);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000290 if (ifdlist) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000291 ret = PyTuple_Pack(3, ifdlist, ifdlist, ifdlist);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000292 Py_DECREF(ifdlist);
293 }
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000294 }
Barry Warsawc1cb3601996-12-12 22:16:21 +0000295 else {
296 /* any of these three calls can raise an exception. it's more
297 convenient to test for this after all three calls... but
298 is that acceptable?
299 */
300 ifdlist = set2list(&ifdset, rfd2obj);
301 ofdlist = set2list(&ofdset, wfd2obj);
302 efdlist = set2list(&efdset, efd2obj);
303 if (PyErr_Occurred())
304 ret = NULL;
305 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000306 ret = PyTuple_Pack(3, ifdlist, ofdlist, efdlist);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000307
Barry Warsawc1cb3601996-12-12 22:16:21 +0000308 Py_DECREF(ifdlist);
309 Py_DECREF(ofdlist);
310 Py_DECREF(efdlist);
311 }
312
313 finally:
314 reap_obj(rfd2obj);
315 reap_obj(wfd2obj);
316 reap_obj(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000317#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000318 PyMem_DEL(rfd2obj);
319 PyMem_DEL(wfd2obj);
320 PyMem_DEL(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000321#endif /* SELECT_USES_HEAP */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000322 return ret;
Guido van Rossumed233a51992-06-23 09:07:03 +0000323}
324
Nicholas Bastine62c5c82004-03-21 23:45:42 +0000325#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000326/*
327 * poll() support
328 */
329
330typedef struct {
331 PyObject_HEAD
332 PyObject *dict;
333 int ufd_uptodate;
334 int ufd_len;
335 struct pollfd *ufds;
336} pollObject;
337
Jeremy Hylton938ace62002-07-17 16:30:39 +0000338static PyTypeObject poll_Type;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000339
340/* Update the malloc'ed array of pollfds to match the dictionary
341 contained within a pollObject. Return 1 on success, 0 on an error.
342*/
343
344static int
345update_ufd_array(pollObject *self)
346{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000347 Py_ssize_t i, pos;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000348 PyObject *key, *value;
349
350 self->ufd_len = PyDict_Size(self->dict);
351 PyMem_Resize(self->ufds, struct pollfd, self->ufd_len);
352 if (self->ufds == NULL) {
353 PyErr_NoMemory();
354 return 0;
355 }
356
357 i = pos = 0;
Fred Drakedff3a372001-07-19 21:29:49 +0000358 while (PyDict_Next(self->dict, &pos, &key, &value)) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000359 self->ufds[i].fd = PyLong_AsLong(key);
360 self->ufds[i].events = (short)PyLong_AsLong(value);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000361 i++;
362 }
363 self->ufd_uptodate = 1;
364 return 1;
365}
366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000367PyDoc_STRVAR(poll_register_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000368"register(fd [, eventmask] ) -> None\n\n\
369Register a file descriptor with the polling object.\n\
Barry Warsaw2f704552001-08-16 16:55:10 +0000370fd -- either an integer, or an object with a fileno() method returning an\n\
371 int.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000372events -- an optional bitmask describing the type of events to check for");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000373
374static PyObject *
375poll_register(pollObject *self, PyObject *args)
376{
377 PyObject *o, *key, *value;
378 int fd, events = POLLIN | POLLPRI | POLLOUT;
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000379 int err;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000380
Fred Drake7b87f852001-05-21 03:29:05 +0000381 if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000382 return NULL;
383 }
384
385 fd = PyObject_AsFileDescriptor(o);
386 if (fd == -1) return NULL;
387
388 /* Add entry to the internal dictionary: the key is the
389 file descriptor, and the value is the event mask. */
Christian Heimes217cfd12007-12-02 14:31:20 +0000390 key = PyLong_FromLong(fd);
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000391 if (key == NULL)
392 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +0000393 value = PyLong_FromLong(events);
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000394 if (value == NULL) {
395 Py_DECREF(key);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000396 return NULL;
397 }
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000398 err = PyDict_SetItem(self->dict, key, value);
399 Py_DECREF(key);
400 Py_DECREF(value);
401 if (err < 0)
402 return NULL;
403
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000404 self->ufd_uptodate = 0;
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000405
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000406 Py_INCREF(Py_None);
407 return Py_None;
408}
409
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000410PyDoc_STRVAR(poll_modify_doc,
411"modify(fd, eventmask) -> None\n\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +0000412Modify an already registered file descriptor.\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000413fd -- either an integer, or an object with a fileno() method returning an\n\
414 int.\n\
415events -- an optional bitmask describing the type of events to check for");
416
417static PyObject *
418poll_modify(pollObject *self, PyObject *args)
419{
420 PyObject *o, *key, *value;
421 int fd, events;
422 int err;
423
424 if (!PyArg_ParseTuple(args, "Oi:modify", &o, &events)) {
425 return NULL;
426 }
427
428 fd = PyObject_AsFileDescriptor(o);
429 if (fd == -1) return NULL;
430
431 /* Modify registered fd */
432 key = PyLong_FromLong(fd);
433 if (key == NULL)
434 return NULL;
435 if (PyDict_GetItem(self->dict, key) == NULL) {
436 errno = ENOENT;
437 PyErr_SetFromErrno(PyExc_IOError);
438 return NULL;
439 }
440 value = PyLong_FromLong(events);
441 if (value == NULL) {
442 Py_DECREF(key);
443 return NULL;
444 }
445 err = PyDict_SetItem(self->dict, key, value);
446 Py_DECREF(key);
447 Py_DECREF(value);
448 if (err < 0)
449 return NULL;
450
451 self->ufd_uptodate = 0;
452
453 Py_INCREF(Py_None);
454 return Py_None;
455}
456
457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000458PyDoc_STRVAR(poll_unregister_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000459"unregister(fd) -> None\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000460Remove a file descriptor being tracked by the polling object.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000461
462static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000463poll_unregister(pollObject *self, PyObject *o)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000464{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000465 PyObject *key;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000466 int fd;
467
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000468 fd = PyObject_AsFileDescriptor( o );
469 if (fd == -1)
470 return NULL;
471
472 /* Check whether the fd is already in the array */
Christian Heimes217cfd12007-12-02 14:31:20 +0000473 key = PyLong_FromLong(fd);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000474 if (key == NULL)
475 return NULL;
476
477 if (PyDict_DelItem(self->dict, key) == -1) {
478 Py_DECREF(key);
479 /* This will simply raise the KeyError set by PyDict_DelItem
480 if the file descriptor isn't registered. */
481 return NULL;
482 }
483
484 Py_DECREF(key);
485 self->ufd_uptodate = 0;
486
487 Py_INCREF(Py_None);
488 return Py_None;
489}
490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000491PyDoc_STRVAR(poll_poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000492"poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
493Polls the set of registered file descriptors, returning a list containing \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000494any descriptors that have events or errors to report.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000495
496static PyObject *
497poll_poll(pollObject *self, PyObject *args)
498{
499 PyObject *result_list = NULL, *tout = NULL;
500 int timeout = 0, poll_result, i, j;
501 PyObject *value = NULL, *num = NULL;
502
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000503 if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000504 return NULL;
505 }
506
507 /* Check values for timeout */
508 if (tout == NULL || tout == Py_None)
509 timeout = -1;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000510 else if (!PyNumber_Check(tout)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000511 PyErr_SetString(PyExc_TypeError,
512 "timeout must be an integer or None");
513 return NULL;
514 }
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000515 else {
516 tout = PyNumber_Int(tout);
517 if (!tout)
518 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +0000519 timeout = PyLong_AsLong(tout);
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000520 Py_DECREF(tout);
Neal Norwitz0f46bbf2005-11-03 05:00:25 +0000521 if (timeout == -1 && PyErr_Occurred())
522 return NULL;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000523 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000524
525 /* Ensure the ufd array is up to date */
526 if (!self->ufd_uptodate)
527 if (update_ufd_array(self) == 0)
528 return NULL;
529
530 /* call poll() */
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000531 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000532 poll_result = poll(self->ufds, self->ufd_len, timeout);
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000533 Py_END_ALLOW_THREADS
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000534
535 if (poll_result < 0) {
536 PyErr_SetFromErrno(SelectError);
537 return NULL;
538 }
539
540 /* build the result list */
541
542 result_list = PyList_New(poll_result);
543 if (!result_list)
544 return NULL;
545 else {
546 for (i = 0, j = 0; j < poll_result; j++) {
547 /* skip to the next fired descriptor */
548 while (!self->ufds[i].revents) {
549 i++;
550 }
551 /* if we hit a NULL return, set value to NULL
552 and break out of loop; code at end will
553 clean up result_list */
554 value = PyTuple_New(2);
555 if (value == NULL)
556 goto error;
Christian Heimes217cfd12007-12-02 14:31:20 +0000557 num = PyLong_FromLong(self->ufds[i].fd);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000558 if (num == NULL) {
559 Py_DECREF(value);
560 goto error;
561 }
562 PyTuple_SET_ITEM(value, 0, num);
563
Andrew M. Kuchlinge5dd1622004-08-07 17:21:27 +0000564 /* The &0xffff is a workaround for AIX. 'revents'
565 is a 16-bit short, and IBM assigned POLLNVAL
566 to be 0x8000, so the conversion to int results
567 in a negative number. See SF bug #923315. */
Christian Heimes217cfd12007-12-02 14:31:20 +0000568 num = PyLong_FromLong(self->ufds[i].revents & 0xffff);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000569 if (num == NULL) {
570 Py_DECREF(value);
571 goto error;
572 }
573 PyTuple_SET_ITEM(value, 1, num);
574 if ((PyList_SetItem(result_list, j, value)) == -1) {
575 Py_DECREF(value);
576 goto error;
577 }
578 i++;
579 }
580 }
581 return result_list;
582
583 error:
584 Py_DECREF(result_list);
585 return NULL;
586}
587
588static PyMethodDef poll_methods[] = {
589 {"register", (PyCFunction)poll_register,
590 METH_VARARGS, poll_register_doc},
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000591 {"modify", (PyCFunction)poll_modify,
592 METH_VARARGS, poll_modify_doc},
593 {"unregister", (PyCFunction)poll_unregister,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000594 METH_O, poll_unregister_doc},
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000595 {"poll", (PyCFunction)poll_poll,
596 METH_VARARGS, poll_poll_doc},
597 {NULL, NULL} /* sentinel */
598};
599
600static pollObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000601newPollObject(void)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000602{
603 pollObject *self;
604 self = PyObject_New(pollObject, &poll_Type);
605 if (self == NULL)
606 return NULL;
607 /* ufd_uptodate is a Boolean, denoting whether the
608 array pointed to by ufds matches the contents of the dictionary. */
609 self->ufd_uptodate = 0;
610 self->ufds = NULL;
611 self->dict = PyDict_New();
612 if (self->dict == NULL) {
613 Py_DECREF(self);
614 return NULL;
615 }
616 return self;
617}
618
619static void
620poll_dealloc(pollObject *self)
621{
622 if (self->ufds != NULL)
623 PyMem_DEL(self->ufds);
624 Py_XDECREF(self->dict);
625 PyObject_Del(self);
626}
627
Tim Peters0c322792002-07-17 16:49:03 +0000628static PyTypeObject poll_Type = {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000629 /* The ob_type field must be initialized in the module init function
630 * to be portable to Windows without using C++. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000631 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000632 "select.poll", /*tp_name*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000633 sizeof(pollObject), /*tp_basicsize*/
634 0, /*tp_itemsize*/
635 /* methods */
636 (destructor)poll_dealloc, /*tp_dealloc*/
637 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000638 0, /*tp_getattr*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000639 0, /*tp_setattr*/
640 0, /*tp_compare*/
641 0, /*tp_repr*/
642 0, /*tp_as_number*/
643 0, /*tp_as_sequence*/
644 0, /*tp_as_mapping*/
645 0, /*tp_hash*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000646 0, /*tp_call*/
647 0, /*tp_str*/
648 0, /*tp_getattro*/
649 0, /*tp_setattro*/
650 0, /*tp_as_buffer*/
651 Py_TPFLAGS_DEFAULT, /*tp_flags*/
652 0, /*tp_doc*/
653 0, /*tp_traverse*/
654 0, /*tp_clear*/
655 0, /*tp_richcompare*/
656 0, /*tp_weaklistoffset*/
657 0, /*tp_iter*/
658 0, /*tp_iternext*/
659 poll_methods, /*tp_methods*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000660};
661
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000662PyDoc_STRVAR(poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000663"Returns a polling object, which supports registering and\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000664unregistering file descriptors, and then polling them for I/O events.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000665
666static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000667select_poll(PyObject *self, PyObject *unused)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000668{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000669 return (PyObject *)newPollObject();
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000670}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000671
672#ifdef __APPLE__
673/*
674 * On some systems poll() sets errno on invalid file descriptors. We test
675 * for this at runtime because this bug may be fixed or introduced between
676 * OS releases.
677 */
678static int select_have_broken_poll(void)
679{
680 int poll_test;
681 int filedes[2];
682
683 struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 };
684
685 /* Create a file descriptor to make invalid */
686 if (pipe(filedes) < 0) {
687 return 1;
688 }
689 poll_struct.fd = filedes[0];
690 close(filedes[0]);
691 close(filedes[1]);
692 poll_test = poll(&poll_struct, 1, 0);
693 if (poll_test < 0) {
694 return 1;
695 } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) {
696 return 1;
697 }
698 return 0;
699}
700#endif /* __APPLE__ */
701
702#endif /* HAVE_POLL */
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000703
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000704#ifdef HAVE_EPOLL
705/* **************************************************************************
706 * epoll interface for Linux 2.6
707 *
708 * Written by Christian Heimes
709 * Inspired by Twisted's _epoll.pyx and select.poll()
710 */
711
712#ifdef HAVE_SYS_EPOLL_H
713#include <sys/epoll.h>
714#endif
715
716typedef struct {
717 PyObject_HEAD
718 SOCKET epfd; /* epoll control file descriptor */
719} pyEpoll_Object;
720
721static PyTypeObject pyEpoll_Type;
722#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type))
723
724static PyObject *
725pyepoll_err_closed(void)
726{
727 PyErr_SetString(PyExc_ValueError, "I/O operation on closed epoll fd");
728 return NULL;
729}
730
731static int
732pyepoll_internal_close(pyEpoll_Object *self)
733{
734 int save_errno = 0;
735 if (self->epfd >= 0) {
736 int epfd = self->epfd;
737 self->epfd = -1;
738 Py_BEGIN_ALLOW_THREADS
739 if (close(epfd) < 0)
740 save_errno = errno;
741 Py_END_ALLOW_THREADS
742 }
743 return save_errno;
744}
745
746static PyObject *
747newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
748{
749 pyEpoll_Object *self;
750
751 if (sizehint == -1) {
752 sizehint = FD_SETSIZE-1;
753 }
754 else if (sizehint < 1) {
755 PyErr_Format(PyExc_ValueError,
756 "sizehint must be greater zero, got %d",
757 sizehint);
758 return NULL;
759 }
760
761 assert(type != NULL && type->tp_alloc != NULL);
762 self = (pyEpoll_Object *) type->tp_alloc(type, 0);
763 if (self == NULL)
764 return NULL;
765
766 if (fd == -1) {
767 Py_BEGIN_ALLOW_THREADS
768 self->epfd = epoll_create(sizehint);
769 Py_END_ALLOW_THREADS
770 }
771 else {
772 self->epfd = fd;
773 }
774 if (self->epfd < 0) {
775 Py_DECREF(self);
776 PyErr_SetFromErrno(PyExc_IOError);
777 return NULL;
778 }
779 return (PyObject *)self;
780}
781
782
783static PyObject *
784pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
785{
786 int sizehint = -1;
787 static char *kwlist[] = {"sizehint", NULL};
788
789 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist,
790 &sizehint))
791 return NULL;
792
793 return newPyEpoll_Object(type, sizehint, -1);
794}
795
796
797static void
798pyepoll_dealloc(pyEpoll_Object *self)
799{
800 (void)pyepoll_internal_close(self);
801 Py_TYPE(self)->tp_free(self);
802}
803
804static PyObject*
805pyepoll_close(pyEpoll_Object *self)
806{
807 errno = pyepoll_internal_close(self);
808 if (errno < 0) {
809 PyErr_SetFromErrno(PyExc_IOError);
810 return NULL;
811 }
812 Py_RETURN_NONE;
813}
814
815PyDoc_STRVAR(pyepoll_close_doc,
816"close() -> None\n\
817\n\
818Close the epoll control file descriptor. Further operations on the epoll\n\
819object will raise an exception.");
820
821static PyObject*
822pyepoll_get_closed(pyEpoll_Object *self)
823{
824 if (self->epfd < 0)
825 Py_RETURN_TRUE;
826 else
827 Py_RETURN_FALSE;
828}
829
830static PyObject*
831pyepoll_fileno(pyEpoll_Object *self)
832{
833 if (self->epfd < 0)
834 return pyepoll_err_closed();
835 return PyLong_FromLong(self->epfd);
836}
837
838PyDoc_STRVAR(pyepoll_fileno_doc,
839"fileno() -> int\n\
840\n\
841Return the epoll control file descriptor.");
842
843static PyObject*
844pyepoll_fromfd(PyObject *cls, PyObject *args)
845{
846 SOCKET fd;
847
848 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
849 return NULL;
850
851 return newPyEpoll_Object((PyTypeObject*)cls, -1, fd);
852}
853
854PyDoc_STRVAR(pyepoll_fromfd_doc,
855"fromfd(fd) -> epoll\n\
856\n\
857Create an epoll object from a given control fd.");
858
859static PyObject *
860pyepoll_internal_ctl(int epfd, int op, PyObject *pfd, unsigned int events)
861{
862 struct epoll_event ev;
863 int result;
864 int fd;
865
866 if (epfd < 0)
867 return pyepoll_err_closed();
868
869 fd = PyObject_AsFileDescriptor(pfd);
870 if (fd == -1) {
871 return NULL;
872 }
873
874 switch(op) {
875 case EPOLL_CTL_ADD:
876 case EPOLL_CTL_MOD:
877 ev.events = events;
878 ev.data.fd = fd;
879 Py_BEGIN_ALLOW_THREADS
880 result = epoll_ctl(epfd, op, fd, &ev);
881 Py_END_ALLOW_THREADS
882 break;
883 case EPOLL_CTL_DEL:
884 /* In kernel versions before 2.6.9, the EPOLL_CTL_DEL
885 * operation required a non-NULL pointer in event, even
886 * though this argument is ignored. */
887 Py_BEGIN_ALLOW_THREADS
888 result = epoll_ctl(epfd, op, fd, &ev);
889 if (errno == EBADF) {
890 /* fd already closed */
891 result = 0;
892 errno = 0;
893 }
894 Py_END_ALLOW_THREADS
895 break;
896 default:
897 result = -1;
898 errno = EINVAL;
899 }
900
901 if (result < 0) {
902 PyErr_SetFromErrno(PyExc_IOError);
903 return NULL;
904 }
905 Py_RETURN_NONE;
906}
907
908static PyObject *
909pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
910{
911 PyObject *pfd;
912 unsigned int events = EPOLLIN | EPOLLOUT | EPOLLPRI;
913 static char *kwlist[] = {"fd", "eventmask", NULL};
914
915 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|I:register", kwlist,
916 &pfd, &events)) {
917 return NULL;
918 }
919
920 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_ADD, pfd, events);
921}
922
923PyDoc_STRVAR(pyepoll_register_doc,
924"register(fd[, eventmask]) -> bool\n\
925\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +0000926Registers a new fd or modifies an already registered fd. register() returns\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000927True if a new fd was registered or False if the event mask for fd was modified.\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +0000928fd is the target file descriptor of the operation.\n\
929events is a bit set composed of the various EPOLL constants; the default\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000930is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
931\n\
932The epoll interface supports all file descriptors that support poll.");
933
934static PyObject *
935pyepoll_modify(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
936{
937 PyObject *pfd;
938 unsigned int events;
939 static char *kwlist[] = {"fd", "eventmask", NULL};
940
941 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OI:modify", kwlist,
942 &pfd, &events)) {
943 return NULL;
944 }
945
946 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_MOD, pfd, events);
947}
948
949PyDoc_STRVAR(pyepoll_modify_doc,
950"modify(fd, eventmask) -> None\n\
951\n\
952fd is the target file descriptor of the operation\n\
953events is a bit set composed of the various EPOLL constants");
954
955static PyObject *
956pyepoll_unregister(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
957{
958 PyObject *pfd;
959 static char *kwlist[] = {"fd", NULL};
960
961 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:unregister", kwlist,
962 &pfd)) {
963 return NULL;
964 }
965
966 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_DEL, pfd, 0);
967}
968
969PyDoc_STRVAR(pyepoll_unregister_doc,
970"unregister(fd) -> None\n\
971\n\
972fd is the target file descriptor of the operation.");
973
974static PyObject *
975pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
976{
977 double dtimeout = -1.;
978 int timeout;
979 int maxevents = -1;
980 int nfds, i;
981 PyObject *elist = NULL, *etuple = NULL;
982 struct epoll_event *evs = NULL;
983 static char *kwlist[] = {"timeout", "maxevents", NULL};
984
985 if (self->epfd < 0)
986 return pyepoll_err_closed();
987
988 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|di:poll", kwlist,
989 &dtimeout, &maxevents)) {
990 return NULL;
991 }
992
993 if (dtimeout < 0) {
994 timeout = -1;
995 }
996 else if (dtimeout * 1000.0 > INT_MAX) {
997 PyErr_SetString(PyExc_OverflowError,
998 "timeout is too large");
Christian Heimesf6cd9672008-03-26 13:45:42 +0000999 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001000 }
1001 else {
1002 timeout = (int)(dtimeout * 1000.0);
1003 }
1004
1005 if (maxevents == -1) {
1006 maxevents = FD_SETSIZE-1;
1007 }
1008 else if (maxevents < 1) {
1009 PyErr_Format(PyExc_ValueError,
1010 "maxevents must be greater than 0, got %d",
1011 maxevents);
1012 return NULL;
1013 }
1014
1015 evs = PyMem_New(struct epoll_event, maxevents);
1016 if (evs == NULL) {
1017 Py_DECREF(self);
1018 PyErr_NoMemory();
1019 return NULL;
1020 }
1021
1022 Py_BEGIN_ALLOW_THREADS
1023 nfds = epoll_wait(self->epfd, evs, maxevents, timeout);
1024 Py_END_ALLOW_THREADS
1025 if (nfds < 0) {
1026 PyErr_SetFromErrno(PyExc_IOError);
1027 goto error;
1028 }
1029
1030 elist = PyList_New(nfds);
1031 if (elist == NULL) {
1032 goto error;
1033 }
1034
1035 for (i = 0; i < nfds; i++) {
Christian Heimesf6cd9672008-03-26 13:45:42 +00001036 etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001037 if (etuple == NULL) {
Christian Heimesf6cd9672008-03-26 13:45:42 +00001038 Py_CLEAR(elist);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001039 goto error;
1040 }
1041 PyList_SET_ITEM(elist, i, etuple);
1042 }
1043
Christian Heimesf6cd9672008-03-26 13:45:42 +00001044 error:
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001045 PyMem_Free(evs);
1046 return elist;
1047}
1048
1049PyDoc_STRVAR(pyepoll_poll_doc,
1050"poll([timeout=-1[, maxevents=-1]]) -> [(fd, events), (...)]\n\
1051\n\
1052Wait for events on the epoll file descriptor for a maximum time of timeout\n\
1053in seconds (as float). -1 makes poll wait indefinitely.\n\
1054Up to maxevents are returned to the caller.");
1055
1056static PyMethodDef pyepoll_methods[] = {
1057 {"fromfd", (PyCFunction)pyepoll_fromfd,
1058 METH_VARARGS | METH_CLASS, pyepoll_fromfd_doc},
1059 {"close", (PyCFunction)pyepoll_close, METH_NOARGS,
1060 pyepoll_close_doc},
1061 {"fileno", (PyCFunction)pyepoll_fileno, METH_NOARGS,
1062 pyepoll_fileno_doc},
1063 {"modify", (PyCFunction)pyepoll_modify,
1064 METH_VARARGS | METH_KEYWORDS, pyepoll_modify_doc},
1065 {"register", (PyCFunction)pyepoll_register,
1066 METH_VARARGS | METH_KEYWORDS, pyepoll_register_doc},
1067 {"unregister", (PyCFunction)pyepoll_unregister,
1068 METH_VARARGS | METH_KEYWORDS, pyepoll_unregister_doc},
1069 {"poll", (PyCFunction)pyepoll_poll,
1070 METH_VARARGS | METH_KEYWORDS, pyepoll_poll_doc},
1071 {NULL, NULL},
1072};
1073
1074static PyGetSetDef pyepoll_getsetlist[] = {
1075 {"closed", (getter)pyepoll_get_closed, NULL,
1076 "True if the epoll handler is closed"},
1077 {0},
1078};
1079
1080PyDoc_STRVAR(pyepoll_doc,
1081"select.epoll([sizehint=-1])\n\
1082\n\
1083Returns an epolling object\n\
1084\n\
1085sizehint must be a positive integer or -1 for the default size. The\n\
1086sizehint is used to optimize internal data structures. It doesn't limit\n\
1087the maximum number of monitored events.");
1088
1089static PyTypeObject pyEpoll_Type = {
1090 PyVarObject_HEAD_INIT(NULL, 0)
1091 "select.epoll", /* tp_name */
1092 sizeof(pyEpoll_Object), /* tp_basicsize */
1093 0, /* tp_itemsize */
1094 (destructor)pyepoll_dealloc, /* tp_dealloc */
1095 0, /* tp_print */
1096 0, /* tp_getattr */
1097 0, /* tp_setattr */
1098 0, /* tp_compare */
1099 0, /* tp_repr */
1100 0, /* tp_as_number */
1101 0, /* tp_as_sequence */
1102 0, /* tp_as_mapping */
1103 0, /* tp_hash */
1104 0, /* tp_call */
1105 0, /* tp_str */
1106 PyObject_GenericGetAttr, /* tp_getattro */
1107 0, /* tp_setattro */
1108 0, /* tp_as_buffer */
1109 Py_TPFLAGS_DEFAULT, /* tp_flags */
1110 pyepoll_doc, /* tp_doc */
1111 0, /* tp_traverse */
1112 0, /* tp_clear */
1113 0, /* tp_richcompare */
1114 0, /* tp_weaklistoffset */
1115 0, /* tp_iter */
1116 0, /* tp_iternext */
1117 pyepoll_methods, /* tp_methods */
1118 0, /* tp_members */
1119 pyepoll_getsetlist, /* tp_getset */
1120 0, /* tp_base */
1121 0, /* tp_dict */
1122 0, /* tp_descr_get */
1123 0, /* tp_descr_set */
1124 0, /* tp_dictoffset */
1125 0, /* tp_init */
1126 0, /* tp_alloc */
1127 pyepoll_new, /* tp_new */
1128 0, /* tp_free */
1129};
1130
1131#endif /* HAVE_EPOLL */
1132
1133#ifdef HAVE_KQUEUE
1134/* **************************************************************************
1135 * kqueue interface for BSD
1136 *
1137 * Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
1138 * All rights reserved.
1139 *
1140 * Redistribution and use in source and binary forms, with or without
1141 * modification, are permitted provided that the following conditions
1142 * are met:
1143 * 1. Redistributions of source code must retain the above copyright
1144 * notice, this list of conditions and the following disclaimer.
1145 * 2. Redistributions in binary form must reproduce the above copyright
1146 * notice, this list of conditions and the following disclaimer in the
1147 * documentation and/or other materials provided with the distribution.
1148 *
1149 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1150 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1151 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1152 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1153 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1154 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1155 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1156 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1157 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1158 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1159 * SUCH DAMAGE.
1160 */
1161
1162#ifdef HAVE_SYS_EVENT_H
1163#include <sys/event.h>
1164#endif
1165
1166PyDoc_STRVAR(kqueue_event_doc,
1167"kevent(ident, filter=KQ_FILTER_READ, flags=KQ_ADD, fflags=0, data=0, udata=0)\n\
1168\n\
1169This object is the equivalent of the struct kevent for the C API.\n\
1170\n\
1171See the kqueue manpage for more detailed information about the meaning\n\
1172of the arguments.\n\
1173\n\
1174One minor note: while you might hope that udata could store a\n\
1175reference to a python object, it cannot, because it is impossible to\n\
1176keep a proper reference count of the object once it's passed into the\n\
1177kernel. Therefore, I have restricted it to only storing an integer. I\n\
1178recommend ignoring it and simply using the 'ident' field to key off\n\
1179of. You could also set up a dictionary on the python side to store a\n\
1180udata->object mapping.");
1181
1182typedef struct {
1183 PyObject_HEAD
1184 struct kevent e;
1185} kqueue_event_Object;
1186
1187static PyTypeObject kqueue_event_Type;
1188
1189#define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type))
1190
1191typedef struct {
1192 PyObject_HEAD
1193 SOCKET kqfd; /* kqueue control fd */
1194} kqueue_queue_Object;
1195
1196static PyTypeObject kqueue_queue_Type;
1197
1198#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type))
1199
1200/* Unfortunately, we can't store python objects in udata, because
1201 * kevents in the kernel can be removed without warning, which would
1202 * forever lose the refcount on the object stored with it.
1203 */
1204
1205#define KQ_OFF(x) offsetof(kqueue_event_Object, x)
1206static struct PyMemberDef kqueue_event_members[] = {
1207 {"ident", T_UINT, KQ_OFF(e.ident)},
1208 {"filter", T_SHORT, KQ_OFF(e.filter)},
1209 {"flags", T_USHORT, KQ_OFF(e.flags)},
1210 {"fflags", T_UINT, KQ_OFF(e.fflags)},
1211 {"data", T_INT, KQ_OFF(e.data)},
1212 {"udata", T_INT, KQ_OFF(e.udata)},
1213 {NULL} /* Sentinel */
1214};
1215#undef KQ_OFF
1216
1217static PyObject *
1218kqueue_event_repr(kqueue_event_Object *s)
1219{
1220 char buf[1024];
1221 PyOS_snprintf(
1222 buf, sizeof(buf),
1223 "<select.kevent ident=%lu filter=%d flags=0x%x fflags=0x%x "
1224 "data=0x%lx udata=%p>",
1225 (unsigned long)(s->e.ident), s->e.filter, s->e.flags,
1226 s->e.fflags, (long)(s->e.data), s->e.udata);
Christian Heimes72b710a2008-05-26 13:28:38 +00001227 return PyBytes_FromString(buf);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001228}
1229
1230static int
1231kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds)
1232{
1233 PyObject *pfd;
1234 static char *kwlist[] = {"ident", "filter", "flags", "fflags",
1235 "data", "udata", NULL};
1236
1237 EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
1238
1239 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|hhiii:kevent", kwlist,
1240 &pfd, &(self->e.filter), &(self->e.flags),
1241 &(self->e.fflags), &(self->e.data), &(self->e.udata))) {
1242 return -1;
1243 }
1244
1245 self->e.ident = PyObject_AsFileDescriptor(pfd);
1246 if (self->e.ident == -1) {
1247 return -1;
1248 }
1249 return 0;
1250}
1251
1252static PyObject *
1253kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
1254 int op)
1255{
1256 int result = 0;
1257
1258 if (!kqueue_event_Check(o)) {
1259 if (op == Py_EQ || op == Py_NE) {
1260 PyObject *res = op == Py_EQ ? Py_False : Py_True;
1261 Py_INCREF(res);
1262 return res;
1263 }
1264 PyErr_Format(PyExc_TypeError,
1265 "can't compare %.200s to %.200s",
1266 Py_TYPE(s)->tp_name, Py_TYPE(o)->tp_name);
1267 return NULL;
1268 }
1269 if (((result = s->e.ident - o->e.ident) == 0) &&
1270 ((result = s->e.filter - o->e.filter) == 0) &&
1271 ((result = s->e.flags - o->e.flags) == 0) &&
1272 ((result = s->e.fflags - o->e.fflags) == 0) &&
1273 ((result = s->e.data - o->e.data) == 0) &&
1274 ((result = s->e.udata - o->e.udata) == 0)
1275 ) {
1276 result = 0;
1277 }
1278
1279 switch (op) {
1280 case Py_EQ:
1281 result = (result == 0);
1282 break;
1283 case Py_NE:
1284 result = (result != 0);
1285 break;
1286 case Py_LE:
1287 result = (result <= 0);
1288 break;
1289 case Py_GE:
1290 result = (result >= 0);
1291 break;
1292 case Py_LT:
1293 result = (result < 0);
1294 break;
1295 case Py_GT:
1296 result = (result > 0);
1297 break;
1298 }
1299 return PyBool_FromLong(result);
1300}
1301
1302static PyTypeObject kqueue_event_Type = {
1303 PyVarObject_HEAD_INIT(NULL, 0)
1304 "select.kevent", /* tp_name */
1305 sizeof(kqueue_event_Object), /* tp_basicsize */
1306 0, /* tp_itemsize */
1307 0, /* tp_dealloc */
1308 0, /* tp_print */
1309 0, /* tp_getattr */
1310 0, /* tp_setattr */
1311 0, /* tp_compare */
1312 (reprfunc)kqueue_event_repr, /* tp_repr */
1313 0, /* tp_as_number */
1314 0, /* tp_as_sequence */
1315 0, /* tp_as_mapping */
1316 0, /* tp_hash */
1317 0, /* tp_call */
1318 0, /* tp_str */
1319 0, /* tp_getattro */
1320 0, /* tp_setattro */
1321 0, /* tp_as_buffer */
1322 Py_TPFLAGS_DEFAULT, /* tp_flags */
1323 kqueue_event_doc, /* tp_doc */
1324 0, /* tp_traverse */
1325 0, /* tp_clear */
1326 (richcmpfunc)kqueue_event_richcompare, /* tp_richcompare */
1327 0, /* tp_weaklistoffset */
1328 0, /* tp_iter */
1329 0, /* tp_iternext */
1330 0, /* tp_methods */
1331 kqueue_event_members, /* tp_members */
1332 0, /* tp_getset */
1333 0, /* tp_base */
1334 0, /* tp_dict */
1335 0, /* tp_descr_get */
1336 0, /* tp_descr_set */
1337 0, /* tp_dictoffset */
1338 (initproc)kqueue_event_init, /* tp_init */
1339 0, /* tp_alloc */
1340 0, /* tp_new */
1341 0, /* tp_free */
1342};
1343
1344static PyObject *
1345kqueue_queue_err_closed(void)
1346{
1347 PyErr_SetString(PyExc_ValueError, "I/O operation on closed kqueue fd");
1348 return NULL;
1349}
1350
1351static int
1352kqueue_queue_internal_close(kqueue_queue_Object *self)
1353{
1354 int save_errno = 0;
1355 if (self->kqfd >= 0) {
1356 int kqfd = self->kqfd;
1357 self->kqfd = -1;
1358 Py_BEGIN_ALLOW_THREADS
1359 if (close(kqfd) < 0)
1360 save_errno = errno;
1361 Py_END_ALLOW_THREADS
1362 }
1363 return save_errno;
1364}
1365
1366static PyObject *
1367newKqueue_Object(PyTypeObject *type, SOCKET fd)
1368{
1369 kqueue_queue_Object *self;
1370 assert(type != NULL && type->tp_alloc != NULL);
1371 self = (kqueue_queue_Object *) type->tp_alloc(type, 0);
1372 if (self == NULL) {
1373 return NULL;
1374 }
1375
1376 if (fd == -1) {
1377 Py_BEGIN_ALLOW_THREADS
1378 self->kqfd = kqueue();
1379 Py_END_ALLOW_THREADS
1380 }
1381 else {
1382 self->kqfd = fd;
1383 }
1384 if (self->kqfd < 0) {
1385 Py_DECREF(self);
1386 PyErr_SetFromErrno(PyExc_IOError);
1387 return NULL;
1388 }
1389 return (PyObject *)self;
1390}
1391
1392static PyObject *
1393kqueue_queue_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1394{
1395
1396 if ((args != NULL && PyObject_Size(args)) ||
1397 (kwds != NULL && PyObject_Size(kwds))) {
1398 PyErr_SetString(PyExc_ValueError,
1399 "select.kqueue doesn't accept arguments");
1400 return NULL;
1401 }
1402
1403 return newKqueue_Object(type, -1);
1404}
1405
1406static void
1407kqueue_queue_dealloc(kqueue_queue_Object *self)
1408{
1409 kqueue_queue_internal_close(self);
1410 Py_TYPE(self)->tp_free(self);
1411}
1412
1413static PyObject*
1414kqueue_queue_close(kqueue_queue_Object *self)
1415{
1416 errno = kqueue_queue_internal_close(self);
1417 if (errno < 0) {
1418 PyErr_SetFromErrno(PyExc_IOError);
1419 return NULL;
1420 }
1421 Py_RETURN_NONE;
1422}
1423
1424PyDoc_STRVAR(kqueue_queue_close_doc,
1425"close() -> None\n\
1426\n\
1427Close the kqueue control file descriptor. Further operations on the kqueue\n\
1428object will raise an exception.");
1429
1430static PyObject*
1431kqueue_queue_get_closed(kqueue_queue_Object *self)
1432{
1433 if (self->kqfd < 0)
1434 Py_RETURN_TRUE;
1435 else
1436 Py_RETURN_FALSE;
1437}
1438
1439static PyObject*
1440kqueue_queue_fileno(kqueue_queue_Object *self)
1441{
1442 if (self->kqfd < 0)
1443 return kqueue_queue_err_closed();
1444 return PyLong_FromLong(self->kqfd);
1445}
1446
1447PyDoc_STRVAR(kqueue_queue_fileno_doc,
1448"fileno() -> int\n\
1449\n\
1450Return the kqueue control file descriptor.");
1451
1452static PyObject*
1453kqueue_queue_fromfd(PyObject *cls, PyObject *args)
1454{
1455 SOCKET fd;
1456
1457 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
1458 return NULL;
1459
1460 return newKqueue_Object((PyTypeObject*)cls, fd);
1461}
1462
1463PyDoc_STRVAR(kqueue_queue_fromfd_doc,
1464"fromfd(fd) -> kqueue\n\
1465\n\
1466Create a kqueue object from a given control fd.");
1467
1468static PyObject *
1469kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
1470{
1471 int nevents = 0;
1472 int gotevents = 0;
1473 int nchanges = 0;
1474 int i = 0;
1475 PyObject *otimeout = NULL;
1476 PyObject *ch = NULL;
1477 PyObject *it = NULL, *ei = NULL;
1478 PyObject *result = NULL;
1479 struct kevent *evl = NULL;
1480 struct kevent *chl = NULL;
1481 struct timespec timeoutspec;
1482 struct timespec *ptimeoutspec;
1483
1484 if (self->kqfd < 0)
1485 return kqueue_queue_err_closed();
1486
1487 if (!PyArg_ParseTuple(args, "Oi|O:control", &ch, &nevents, &otimeout))
1488 return NULL;
1489
1490 if (nevents < 0) {
1491 PyErr_Format(PyExc_ValueError,
1492 "Length of eventlist must be 0 or positive, got %d",
1493 nchanges);
1494 return NULL;
1495 }
1496
1497 if (ch != NULL && ch != Py_None) {
1498 it = PyObject_GetIter(ch);
1499 if (it == NULL) {
1500 PyErr_SetString(PyExc_TypeError,
1501 "changelist is not iterable");
1502 return NULL;
1503 }
1504 nchanges = PyObject_Size(ch);
1505 if (nchanges < 0) {
1506 return NULL;
1507 }
1508 }
1509
1510 if (otimeout == Py_None || otimeout == NULL) {
1511 ptimeoutspec = NULL;
1512 }
1513 else if (PyNumber_Check(otimeout)) {
1514 double timeout;
1515 long seconds;
1516
1517 timeout = PyFloat_AsDouble(otimeout);
1518 if (timeout == -1 && PyErr_Occurred())
1519 return NULL;
1520 if (timeout > (double)LONG_MAX) {
1521 PyErr_SetString(PyExc_OverflowError,
1522 "timeout period too long");
1523 return NULL;
1524 }
1525 if (timeout < 0) {
1526 PyErr_SetString(PyExc_ValueError,
1527 "timeout must be positive or None");
1528 return NULL;
1529 }
1530
1531 seconds = (long)timeout;
1532 timeout = timeout - (double)seconds;
1533 timeoutspec.tv_sec = seconds;
1534 timeoutspec.tv_nsec = (long)(timeout * 1E9);
1535 ptimeoutspec = &timeoutspec;
1536 }
1537 else {
1538 PyErr_Format(PyExc_TypeError,
1539 "timeout argument must be an number "
1540 "or None, got %.200s",
1541 Py_TYPE(otimeout)->tp_name);
1542 return NULL;
1543 }
1544
1545 if (nchanges) {
1546 chl = PyMem_New(struct kevent, nchanges);
1547 if (chl == NULL) {
1548 PyErr_NoMemory();
1549 return NULL;
1550 }
1551 while ((ei = PyIter_Next(it)) != NULL) {
1552 if (!kqueue_event_Check(ei)) {
1553 Py_DECREF(ei);
1554 PyErr_SetString(PyExc_TypeError,
1555 "changelist must be an iterable of "
1556 "select.kevent objects");
1557 goto error;
1558 } else {
1559 chl[i] = ((kqueue_event_Object *)ei)->e;
1560 }
1561 Py_DECREF(ei);
1562 }
1563 }
1564 Py_CLEAR(it);
1565
1566 /* event list */
1567 if (nevents) {
1568 evl = PyMem_New(struct kevent, nevents);
1569 if (evl == NULL) {
1570 PyErr_NoMemory();
1571 return NULL;
1572 }
1573 }
1574
1575 Py_BEGIN_ALLOW_THREADS
1576 gotevents = kevent(self->kqfd, chl, nchanges,
1577 evl, nevents, ptimeoutspec);
1578 Py_END_ALLOW_THREADS
1579
1580 if (gotevents == -1) {
1581 PyErr_SetFromErrno(PyExc_OSError);
1582 goto error;
1583 }
1584
1585 result = PyList_New(gotevents);
1586 if (result == NULL) {
1587 goto error;
1588 }
1589
1590 for (i=0; i < gotevents; i++) {
1591 kqueue_event_Object *ch;
1592
1593 ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type);
1594 if (ch == NULL) {
1595 goto error;
1596 }
1597 ch->e = evl[i];
1598 PyList_SET_ITEM(result, i, (PyObject *)ch);
1599 }
1600 PyMem_Free(chl);
1601 PyMem_Free(evl);
1602 return result;
1603
1604 error:
1605 PyMem_Free(chl);
1606 PyMem_Free(evl);
1607 Py_XDECREF(result);
1608 Py_XDECREF(it);
1609 return NULL;
1610}
1611
1612PyDoc_STRVAR(kqueue_queue_control_doc,
1613"control(changelist, max_events=0[, timeout=None]) -> eventlist\n\
1614\n\
1615Calls the kernel kevent function.\n\
1616- changelist must be a list of kevent objects describing the changes\n\
1617 to be made to the kernel's watch list or None.\n\
1618- max_events lets you specify the maximum number of events that the\n\
1619 kernel will return.\n\
1620- timeout is the maximum time to wait in seconds, or else None,\n\
1621 to wait forever. timeout accepts floats for smaller timeouts, too.");
1622
1623
1624static PyMethodDef kqueue_queue_methods[] = {
1625 {"fromfd", (PyCFunction)kqueue_queue_fromfd,
1626 METH_VARARGS | METH_CLASS, kqueue_queue_fromfd_doc},
1627 {"close", (PyCFunction)kqueue_queue_close, METH_NOARGS,
1628 kqueue_queue_close_doc},
1629 {"fileno", (PyCFunction)kqueue_queue_fileno, METH_NOARGS,
1630 kqueue_queue_fileno_doc},
1631 {"control", (PyCFunction)kqueue_queue_control,
1632 METH_VARARGS , kqueue_queue_control_doc},
1633 {NULL, NULL},
1634};
1635
1636static PyGetSetDef kqueue_queue_getsetlist[] = {
1637 {"closed", (getter)kqueue_queue_get_closed, NULL,
1638 "True if the kqueue handler is closed"},
1639 {0},
1640};
1641
1642PyDoc_STRVAR(kqueue_queue_doc,
1643"Kqueue syscall wrapper.\n\
1644\n\
1645For example, to start watching a socket for input:\n\
1646>>> kq = kqueue()\n\
1647>>> sock = socket()\n\
1648>>> sock.connect((host, port))\n\
1649>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_ADD)], 0)\n\
1650\n\
1651To wait one second for it to become writeable:\n\
1652>>> kq.control(None, 1, 1000)\n\
1653\n\
1654To stop listening:\n\
1655>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_DELETE)], 0)");
1656
1657static PyTypeObject kqueue_queue_Type = {
1658 PyVarObject_HEAD_INIT(NULL, 0)
1659 "select.kqueue", /* tp_name */
1660 sizeof(kqueue_queue_Object), /* tp_basicsize */
1661 0, /* tp_itemsize */
1662 (destructor)kqueue_queue_dealloc, /* tp_dealloc */
1663 0, /* tp_print */
1664 0, /* tp_getattr */
1665 0, /* tp_setattr */
1666 0, /* tp_compare */
1667 0, /* tp_repr */
1668 0, /* tp_as_number */
1669 0, /* tp_as_sequence */
1670 0, /* tp_as_mapping */
1671 0, /* tp_hash */
1672 0, /* tp_call */
1673 0, /* tp_str */
1674 0, /* tp_getattro */
1675 0, /* tp_setattro */
1676 0, /* tp_as_buffer */
1677 Py_TPFLAGS_DEFAULT, /* tp_flags */
1678 kqueue_queue_doc, /* tp_doc */
1679 0, /* tp_traverse */
1680 0, /* tp_clear */
1681 0, /* tp_richcompare */
1682 0, /* tp_weaklistoffset */
1683 0, /* tp_iter */
1684 0, /* tp_iternext */
1685 kqueue_queue_methods, /* tp_methods */
1686 0, /* tp_members */
1687 kqueue_queue_getsetlist, /* tp_getset */
1688 0, /* tp_base */
1689 0, /* tp_dict */
1690 0, /* tp_descr_get */
1691 0, /* tp_descr_set */
1692 0, /* tp_dictoffset */
1693 0, /* tp_init */
1694 0, /* tp_alloc */
1695 kqueue_queue_new, /* tp_new */
1696 0, /* tp_free */
1697};
1698
1699#endif /* HAVE_KQUEUE */
1700/* ************************************************************************ */
1701
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001702PyDoc_STRVAR(select_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001703"select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
1704\n\
1705Wait until one or more file descriptors are ready for some kind of I/O.\n\
Brett Cannon62dba4c2003-09-10 19:37:42 +00001706The first three arguments are sequences of file descriptors to be waited for:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001707rlist -- wait until ready for reading\n\
1708wlist -- wait until ready for writing\n\
1709xlist -- wait for an ``exceptional condition''\n\
1710If only one kind of condition is required, pass [] for the other lists.\n\
1711A file descriptor is either a socket or file object, or a small integer\n\
1712gotten from a fileno() method call on one of those.\n\
1713\n\
1714The optional 4th argument specifies a timeout in seconds; it may be\n\
1715a floating point number to specify fractions of seconds. If it is absent\n\
1716or None, the call will never time out.\n\
1717\n\
1718The return value is a tuple of three lists corresponding to the first three\n\
1719arguments; each contains the subset of the corresponding file descriptors\n\
1720that are ready.\n\
1721\n\
1722*** IMPORTANT NOTICE ***\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001723On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +00001724descriptors can be used.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001725
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00001726static PyMethodDef select_methods[] = {
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001727 {"select", select_select, METH_VARARGS, select_doc},
1728#ifdef HAVE_POLL
1729 {"poll", select_poll, METH_NOARGS, poll_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001730#endif /* HAVE_POLL */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001731 {0, 0}, /* sentinel */
Guido van Rossumed233a51992-06-23 09:07:03 +00001732};
1733
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001734PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001735"This module supports asynchronous I/O on multiple file descriptors.\n\
1736\n\
1737*** IMPORTANT NOTICE ***\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001738On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.");
Guido van Rossumed233a51992-06-23 09:07:03 +00001739
Martin v. Löwis1a214512008-06-11 05:26:20 +00001740
1741static struct PyModuleDef selectmodule = {
1742 PyModuleDef_HEAD_INIT,
1743 "select",
1744 module_doc,
1745 -1,
1746 select_methods,
1747 NULL,
1748 NULL,
1749 NULL,
1750 NULL
1751};
1752
Mark Hammond62b1ab12002-07-23 06:31:15 +00001753PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001754PyInit_select(void)
Guido van Rossumed233a51992-06-23 09:07:03 +00001755{
Fred Drake4baedc12002-04-01 14:53:37 +00001756 PyObject *m;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001757 m = PyModule_Create(&selectmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001758 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001759 return NULL;
Fred Drake4baedc12002-04-01 14:53:37 +00001760
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001761 SelectError = PyErr_NewException("select.error", NULL, NULL);
Fred Drake4baedc12002-04-01 14:53:37 +00001762 Py_INCREF(SelectError);
1763 PyModule_AddObject(m, "error", SelectError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001764
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001765#if defined(HAVE_POLL)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001766#ifdef __APPLE__
1767 if (select_have_broken_poll()) {
1768 if (PyObject_DelAttrString(m, "poll") == -1) {
1769 PyErr_Clear();
1770 }
1771 } else {
1772#else
1773 {
1774#endif
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001775 if (PyType_Ready(&poll_Type) < 0)
1776 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001777 PyModule_AddIntConstant(m, "POLLIN", POLLIN);
1778 PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
1779 PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
1780 PyModule_AddIntConstant(m, "POLLERR", POLLERR);
1781 PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
1782 PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +00001783
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001784#ifdef POLLRDNORM
Thomas Wouters477c8d52006-05-27 19:21:47 +00001785 PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001786#endif
1787#ifdef POLLRDBAND
Thomas Wouters477c8d52006-05-27 19:21:47 +00001788 PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001789#endif
1790#ifdef POLLWRNORM
Thomas Wouters477c8d52006-05-27 19:21:47 +00001791 PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001792#endif
1793#ifdef POLLWRBAND
Thomas Wouters477c8d52006-05-27 19:21:47 +00001794 PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001795#endif
Sjoerd Mullender239f8362000-08-25 13:59:18 +00001796#ifdef POLLMSG
Thomas Wouters477c8d52006-05-27 19:21:47 +00001797 PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
Sjoerd Mullender239f8362000-08-25 13:59:18 +00001798#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001799 }
1800#endif /* HAVE_POLL */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001801
1802#ifdef HAVE_EPOLL
1803 Py_TYPE(&pyEpoll_Type) = &PyType_Type;
1804 if (PyType_Ready(&pyEpoll_Type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001805 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001806
1807 Py_INCREF(&pyEpoll_Type);
1808 PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type);
1809
1810 PyModule_AddIntConstant(m, "EPOLLIN", EPOLLIN);
1811 PyModule_AddIntConstant(m, "EPOLLOUT", EPOLLOUT);
1812 PyModule_AddIntConstant(m, "EPOLLPRI", EPOLLPRI);
1813 PyModule_AddIntConstant(m, "EPOLLERR", EPOLLERR);
1814 PyModule_AddIntConstant(m, "EPOLLHUP", EPOLLHUP);
1815 PyModule_AddIntConstant(m, "EPOLLET", EPOLLET);
1816#ifdef EPOLLONESHOT
1817 /* Kernel 2.6.2+ */
1818 PyModule_AddIntConstant(m, "EPOLLONESHOT", EPOLLONESHOT);
1819#endif
1820 /* PyModule_AddIntConstant(m, "EPOLL_RDHUP", EPOLLRDHUP); */
1821 PyModule_AddIntConstant(m, "EPOLLRDNORM", EPOLLRDNORM);
1822 PyModule_AddIntConstant(m, "EPOLLRDBAND", EPOLLRDBAND);
1823 PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
1824 PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
1825 PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
1826#endif /* HAVE_EPOLL */
1827
1828#ifdef HAVE_KQUEUE
1829 kqueue_event_Type.tp_new = PyType_GenericNew;
1830 Py_TYPE(&kqueue_event_Type) = &PyType_Type;
1831 if(PyType_Ready(&kqueue_event_Type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001832 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001833
1834 Py_INCREF(&kqueue_event_Type);
1835 PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type);
1836
1837 Py_TYPE(&kqueue_queue_Type) = &PyType_Type;
1838 if(PyType_Ready(&kqueue_queue_Type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001839 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001840 Py_INCREF(&kqueue_queue_Type);
1841 PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type);
1842
1843 /* event filters */
1844 PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
1845 PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE);
1846 PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO);
1847 PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE);
1848 PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC);
1849#ifdef EVFILT_NETDEV
1850 PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV);
1851#endif
1852 PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
1853 PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER);
1854
1855 /* event flags */
1856 PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD);
1857 PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE);
1858 PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE);
1859 PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE);
1860 PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT);
1861 PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR);
1862
1863 PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS);
1864 PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1);
1865
1866 PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF);
1867 PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR);
1868
1869 /* READ WRITE filter flag */
1870 PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT);
1871
1872 /* VNODE filter flags */
1873 PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE);
1874 PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE);
1875 PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND);
1876 PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB);
1877 PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK);
1878 PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME);
1879 PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE);
1880
1881 /* PROC filter flags */
1882 PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT);
1883 PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK);
1884 PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC);
1885 PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
1886 PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
1887
1888 PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK);
1889 PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD);
1890 PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR);
1891
1892 /* NETDEV filter flags */
1893#ifdef EVFILT_NETDEV
1894 PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP);
1895 PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
1896 PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV);
1897#endif
1898
1899#endif /* HAVE_KQUEUE */
Martin v. Löwis1a214512008-06-11 05:26:20 +00001900 return m;
Guido van Rossumed233a51992-06-23 09:07:03 +00001901}