blob: c13bab91fc3e938ea20d0267d974e24125cc29bb [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;
Georg Brandld492ad82008-07-23 16:13:07 +0000349 struct pollfd *old_ufds = self->ufds;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000350
351 self->ufd_len = PyDict_Size(self->dict);
Georg Brandld492ad82008-07-23 16:13:07 +0000352 PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000353 if (self->ufds == NULL) {
Georg Brandld492ad82008-07-23 16:13:07 +0000354 self->ufds = old_ufds;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000355 PyErr_NoMemory();
356 return 0;
357 }
358
359 i = pos = 0;
Fred Drakedff3a372001-07-19 21:29:49 +0000360 while (PyDict_Next(self->dict, &pos, &key, &value)) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000361 self->ufds[i].fd = PyLong_AsLong(key);
362 self->ufds[i].events = (short)PyLong_AsLong(value);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000363 i++;
364 }
365 self->ufd_uptodate = 1;
366 return 1;
367}
368
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000369PyDoc_STRVAR(poll_register_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000370"register(fd [, eventmask] ) -> None\n\n\
371Register a file descriptor with the polling object.\n\
Barry Warsaw2f704552001-08-16 16:55:10 +0000372fd -- either an integer, or an object with a fileno() method returning an\n\
373 int.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000374events -- an optional bitmask describing the type of events to check for");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000375
376static PyObject *
377poll_register(pollObject *self, PyObject *args)
378{
379 PyObject *o, *key, *value;
380 int fd, events = POLLIN | POLLPRI | POLLOUT;
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000381 int err;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000382
Fred Drake7b87f852001-05-21 03:29:05 +0000383 if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000384 return NULL;
385 }
386
387 fd = PyObject_AsFileDescriptor(o);
388 if (fd == -1) return NULL;
389
390 /* Add entry to the internal dictionary: the key is the
391 file descriptor, and the value is the event mask. */
Christian Heimes217cfd12007-12-02 14:31:20 +0000392 key = PyLong_FromLong(fd);
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000393 if (key == NULL)
394 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +0000395 value = PyLong_FromLong(events);
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000396 if (value == NULL) {
397 Py_DECREF(key);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000398 return NULL;
399 }
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000400 err = PyDict_SetItem(self->dict, key, value);
401 Py_DECREF(key);
402 Py_DECREF(value);
403 if (err < 0)
404 return NULL;
405
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000406 self->ufd_uptodate = 0;
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000407
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000408 Py_INCREF(Py_None);
409 return Py_None;
410}
411
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000412PyDoc_STRVAR(poll_modify_doc,
413"modify(fd, eventmask) -> None\n\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +0000414Modify an already registered file descriptor.\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000415fd -- either an integer, or an object with a fileno() method returning an\n\
416 int.\n\
417events -- an optional bitmask describing the type of events to check for");
418
419static PyObject *
420poll_modify(pollObject *self, PyObject *args)
421{
422 PyObject *o, *key, *value;
423 int fd, events;
424 int err;
425
426 if (!PyArg_ParseTuple(args, "Oi:modify", &o, &events)) {
427 return NULL;
428 }
429
430 fd = PyObject_AsFileDescriptor(o);
431 if (fd == -1) return NULL;
432
433 /* Modify registered fd */
434 key = PyLong_FromLong(fd);
435 if (key == NULL)
436 return NULL;
437 if (PyDict_GetItem(self->dict, key) == NULL) {
438 errno = ENOENT;
439 PyErr_SetFromErrno(PyExc_IOError);
440 return NULL;
441 }
442 value = PyLong_FromLong(events);
443 if (value == NULL) {
444 Py_DECREF(key);
445 return NULL;
446 }
447 err = PyDict_SetItem(self->dict, key, value);
448 Py_DECREF(key);
449 Py_DECREF(value);
450 if (err < 0)
451 return NULL;
452
453 self->ufd_uptodate = 0;
454
455 Py_INCREF(Py_None);
456 return Py_None;
457}
458
459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000460PyDoc_STRVAR(poll_unregister_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000461"unregister(fd) -> None\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000462Remove a file descriptor being tracked by the polling object.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000463
464static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000465poll_unregister(pollObject *self, PyObject *o)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000466{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000467 PyObject *key;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000468 int fd;
469
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000470 fd = PyObject_AsFileDescriptor( o );
471 if (fd == -1)
472 return NULL;
473
474 /* Check whether the fd is already in the array */
Christian Heimes217cfd12007-12-02 14:31:20 +0000475 key = PyLong_FromLong(fd);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000476 if (key == NULL)
477 return NULL;
478
479 if (PyDict_DelItem(self->dict, key) == -1) {
480 Py_DECREF(key);
481 /* This will simply raise the KeyError set by PyDict_DelItem
482 if the file descriptor isn't registered. */
483 return NULL;
484 }
485
486 Py_DECREF(key);
487 self->ufd_uptodate = 0;
488
489 Py_INCREF(Py_None);
490 return Py_None;
491}
492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000493PyDoc_STRVAR(poll_poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000494"poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
495Polls the set of registered file descriptors, returning a list containing \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000496any descriptors that have events or errors to report.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000497
498static PyObject *
499poll_poll(pollObject *self, PyObject *args)
500{
501 PyObject *result_list = NULL, *tout = NULL;
502 int timeout = 0, poll_result, i, j;
503 PyObject *value = NULL, *num = NULL;
504
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000505 if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000506 return NULL;
507 }
508
509 /* Check values for timeout */
510 if (tout == NULL || tout == Py_None)
511 timeout = -1;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000512 else if (!PyNumber_Check(tout)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000513 PyErr_SetString(PyExc_TypeError,
514 "timeout must be an integer or None");
515 return NULL;
516 }
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000517 else {
Mark Dickinson17c7cd82009-01-17 21:57:11 +0000518 tout = PyNumber_Long(tout);
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000519 if (!tout)
520 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +0000521 timeout = PyLong_AsLong(tout);
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000522 Py_DECREF(tout);
Neal Norwitz0f46bbf2005-11-03 05:00:25 +0000523 if (timeout == -1 && PyErr_Occurred())
524 return NULL;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000525 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000526
527 /* Ensure the ufd array is up to date */
528 if (!self->ufd_uptodate)
529 if (update_ufd_array(self) == 0)
530 return NULL;
531
532 /* call poll() */
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000533 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000534 poll_result = poll(self->ufds, self->ufd_len, timeout);
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000535 Py_END_ALLOW_THREADS
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000536
537 if (poll_result < 0) {
538 PyErr_SetFromErrno(SelectError);
539 return NULL;
540 }
541
542 /* build the result list */
543
544 result_list = PyList_New(poll_result);
545 if (!result_list)
546 return NULL;
547 else {
548 for (i = 0, j = 0; j < poll_result; j++) {
549 /* skip to the next fired descriptor */
550 while (!self->ufds[i].revents) {
551 i++;
552 }
553 /* if we hit a NULL return, set value to NULL
554 and break out of loop; code at end will
555 clean up result_list */
556 value = PyTuple_New(2);
557 if (value == NULL)
558 goto error;
Christian Heimes217cfd12007-12-02 14:31:20 +0000559 num = PyLong_FromLong(self->ufds[i].fd);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000560 if (num == NULL) {
561 Py_DECREF(value);
562 goto error;
563 }
564 PyTuple_SET_ITEM(value, 0, num);
565
Andrew M. Kuchlinge5dd1622004-08-07 17:21:27 +0000566 /* The &0xffff is a workaround for AIX. 'revents'
567 is a 16-bit short, and IBM assigned POLLNVAL
568 to be 0x8000, so the conversion to int results
569 in a negative number. See SF bug #923315. */
Christian Heimes217cfd12007-12-02 14:31:20 +0000570 num = PyLong_FromLong(self->ufds[i].revents & 0xffff);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000571 if (num == NULL) {
572 Py_DECREF(value);
573 goto error;
574 }
575 PyTuple_SET_ITEM(value, 1, num);
576 if ((PyList_SetItem(result_list, j, value)) == -1) {
577 Py_DECREF(value);
578 goto error;
579 }
580 i++;
581 }
582 }
583 return result_list;
584
585 error:
586 Py_DECREF(result_list);
587 return NULL;
588}
589
590static PyMethodDef poll_methods[] = {
591 {"register", (PyCFunction)poll_register,
592 METH_VARARGS, poll_register_doc},
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000593 {"modify", (PyCFunction)poll_modify,
594 METH_VARARGS, poll_modify_doc},
595 {"unregister", (PyCFunction)poll_unregister,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000596 METH_O, poll_unregister_doc},
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000597 {"poll", (PyCFunction)poll_poll,
598 METH_VARARGS, poll_poll_doc},
599 {NULL, NULL} /* sentinel */
600};
601
602static pollObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000603newPollObject(void)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000604{
605 pollObject *self;
606 self = PyObject_New(pollObject, &poll_Type);
607 if (self == NULL)
608 return NULL;
609 /* ufd_uptodate is a Boolean, denoting whether the
610 array pointed to by ufds matches the contents of the dictionary. */
611 self->ufd_uptodate = 0;
612 self->ufds = NULL;
613 self->dict = PyDict_New();
614 if (self->dict == NULL) {
615 Py_DECREF(self);
616 return NULL;
617 }
618 return self;
619}
620
621static void
622poll_dealloc(pollObject *self)
623{
624 if (self->ufds != NULL)
625 PyMem_DEL(self->ufds);
626 Py_XDECREF(self->dict);
627 PyObject_Del(self);
628}
629
Tim Peters0c322792002-07-17 16:49:03 +0000630static PyTypeObject poll_Type = {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000631 /* The ob_type field must be initialized in the module init function
632 * to be portable to Windows without using C++. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000633 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000634 "select.poll", /*tp_name*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000635 sizeof(pollObject), /*tp_basicsize*/
636 0, /*tp_itemsize*/
637 /* methods */
638 (destructor)poll_dealloc, /*tp_dealloc*/
639 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000640 0, /*tp_getattr*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000641 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000642 0, /*tp_reserved*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000643 0, /*tp_repr*/
644 0, /*tp_as_number*/
645 0, /*tp_as_sequence*/
646 0, /*tp_as_mapping*/
647 0, /*tp_hash*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000648 0, /*tp_call*/
649 0, /*tp_str*/
650 0, /*tp_getattro*/
651 0, /*tp_setattro*/
652 0, /*tp_as_buffer*/
653 Py_TPFLAGS_DEFAULT, /*tp_flags*/
654 0, /*tp_doc*/
655 0, /*tp_traverse*/
656 0, /*tp_clear*/
657 0, /*tp_richcompare*/
658 0, /*tp_weaklistoffset*/
659 0, /*tp_iter*/
660 0, /*tp_iternext*/
661 poll_methods, /*tp_methods*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000662};
663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000664PyDoc_STRVAR(poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000665"Returns a polling object, which supports registering and\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000666unregistering file descriptors, and then polling them for I/O events.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000667
668static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000669select_poll(PyObject *self, PyObject *unused)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000670{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000671 return (PyObject *)newPollObject();
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000672}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000673
674#ifdef __APPLE__
675/*
676 * On some systems poll() sets errno on invalid file descriptors. We test
677 * for this at runtime because this bug may be fixed or introduced between
678 * OS releases.
679 */
680static int select_have_broken_poll(void)
681{
682 int poll_test;
683 int filedes[2];
684
685 struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 };
686
687 /* Create a file descriptor to make invalid */
688 if (pipe(filedes) < 0) {
689 return 1;
690 }
691 poll_struct.fd = filedes[0];
692 close(filedes[0]);
693 close(filedes[1]);
694 poll_test = poll(&poll_struct, 1, 0);
695 if (poll_test < 0) {
696 return 1;
697 } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) {
698 return 1;
699 }
700 return 0;
701}
702#endif /* __APPLE__ */
703
704#endif /* HAVE_POLL */
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000705
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000706#ifdef HAVE_EPOLL
707/* **************************************************************************
708 * epoll interface for Linux 2.6
709 *
710 * Written by Christian Heimes
711 * Inspired by Twisted's _epoll.pyx and select.poll()
712 */
713
714#ifdef HAVE_SYS_EPOLL_H
715#include <sys/epoll.h>
716#endif
717
718typedef struct {
719 PyObject_HEAD
720 SOCKET epfd; /* epoll control file descriptor */
721} pyEpoll_Object;
722
723static PyTypeObject pyEpoll_Type;
724#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type))
725
726static PyObject *
727pyepoll_err_closed(void)
728{
729 PyErr_SetString(PyExc_ValueError, "I/O operation on closed epoll fd");
730 return NULL;
731}
732
733static int
734pyepoll_internal_close(pyEpoll_Object *self)
735{
736 int save_errno = 0;
737 if (self->epfd >= 0) {
738 int epfd = self->epfd;
739 self->epfd = -1;
740 Py_BEGIN_ALLOW_THREADS
741 if (close(epfd) < 0)
742 save_errno = errno;
743 Py_END_ALLOW_THREADS
744 }
745 return save_errno;
746}
747
748static PyObject *
749newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
750{
751 pyEpoll_Object *self;
752
753 if (sizehint == -1) {
754 sizehint = FD_SETSIZE-1;
755 }
756 else if (sizehint < 1) {
757 PyErr_Format(PyExc_ValueError,
758 "sizehint must be greater zero, got %d",
759 sizehint);
760 return NULL;
761 }
762
763 assert(type != NULL && type->tp_alloc != NULL);
764 self = (pyEpoll_Object *) type->tp_alloc(type, 0);
765 if (self == NULL)
766 return NULL;
767
768 if (fd == -1) {
769 Py_BEGIN_ALLOW_THREADS
770 self->epfd = epoll_create(sizehint);
771 Py_END_ALLOW_THREADS
772 }
773 else {
774 self->epfd = fd;
775 }
776 if (self->epfd < 0) {
777 Py_DECREF(self);
778 PyErr_SetFromErrno(PyExc_IOError);
779 return NULL;
780 }
781 return (PyObject *)self;
782}
783
784
785static PyObject *
786pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
787{
788 int sizehint = -1;
789 static char *kwlist[] = {"sizehint", NULL};
790
791 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist,
792 &sizehint))
793 return NULL;
794
795 return newPyEpoll_Object(type, sizehint, -1);
796}
797
798
799static void
800pyepoll_dealloc(pyEpoll_Object *self)
801{
802 (void)pyepoll_internal_close(self);
803 Py_TYPE(self)->tp_free(self);
804}
805
806static PyObject*
807pyepoll_close(pyEpoll_Object *self)
808{
809 errno = pyepoll_internal_close(self);
810 if (errno < 0) {
811 PyErr_SetFromErrno(PyExc_IOError);
812 return NULL;
813 }
814 Py_RETURN_NONE;
815}
816
817PyDoc_STRVAR(pyepoll_close_doc,
818"close() -> None\n\
819\n\
820Close the epoll control file descriptor. Further operations on the epoll\n\
821object will raise an exception.");
822
823static PyObject*
824pyepoll_get_closed(pyEpoll_Object *self)
825{
826 if (self->epfd < 0)
827 Py_RETURN_TRUE;
828 else
829 Py_RETURN_FALSE;
830}
831
832static PyObject*
833pyepoll_fileno(pyEpoll_Object *self)
834{
835 if (self->epfd < 0)
836 return pyepoll_err_closed();
837 return PyLong_FromLong(self->epfd);
838}
839
840PyDoc_STRVAR(pyepoll_fileno_doc,
841"fileno() -> int\n\
842\n\
843Return the epoll control file descriptor.");
844
845static PyObject*
846pyepoll_fromfd(PyObject *cls, PyObject *args)
847{
848 SOCKET fd;
849
850 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
851 return NULL;
852
853 return newPyEpoll_Object((PyTypeObject*)cls, -1, fd);
854}
855
856PyDoc_STRVAR(pyepoll_fromfd_doc,
857"fromfd(fd) -> epoll\n\
858\n\
859Create an epoll object from a given control fd.");
860
861static PyObject *
862pyepoll_internal_ctl(int epfd, int op, PyObject *pfd, unsigned int events)
863{
864 struct epoll_event ev;
865 int result;
866 int fd;
867
868 if (epfd < 0)
869 return pyepoll_err_closed();
870
871 fd = PyObject_AsFileDescriptor(pfd);
872 if (fd == -1) {
873 return NULL;
874 }
875
876 switch(op) {
877 case EPOLL_CTL_ADD:
878 case EPOLL_CTL_MOD:
879 ev.events = events;
880 ev.data.fd = fd;
881 Py_BEGIN_ALLOW_THREADS
882 result = epoll_ctl(epfd, op, fd, &ev);
883 Py_END_ALLOW_THREADS
884 break;
885 case EPOLL_CTL_DEL:
886 /* In kernel versions before 2.6.9, the EPOLL_CTL_DEL
887 * operation required a non-NULL pointer in event, even
888 * though this argument is ignored. */
889 Py_BEGIN_ALLOW_THREADS
890 result = epoll_ctl(epfd, op, fd, &ev);
891 if (errno == EBADF) {
892 /* fd already closed */
893 result = 0;
894 errno = 0;
895 }
896 Py_END_ALLOW_THREADS
897 break;
898 default:
899 result = -1;
900 errno = EINVAL;
901 }
902
903 if (result < 0) {
904 PyErr_SetFromErrno(PyExc_IOError);
905 return NULL;
906 }
907 Py_RETURN_NONE;
908}
909
910static PyObject *
911pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
912{
913 PyObject *pfd;
914 unsigned int events = EPOLLIN | EPOLLOUT | EPOLLPRI;
915 static char *kwlist[] = {"fd", "eventmask", NULL};
916
917 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|I:register", kwlist,
918 &pfd, &events)) {
919 return NULL;
920 }
921
922 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_ADD, pfd, events);
923}
924
925PyDoc_STRVAR(pyepoll_register_doc,
926"register(fd[, eventmask]) -> bool\n\
927\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +0000928Registers a new fd or modifies an already registered fd. register() returns\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000929True if a new fd was registered or False if the event mask for fd was modified.\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +0000930fd is the target file descriptor of the operation.\n\
931events is a bit set composed of the various EPOLL constants; the default\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +0000932is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
933\n\
934The epoll interface supports all file descriptors that support poll.");
935
936static PyObject *
937pyepoll_modify(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
938{
939 PyObject *pfd;
940 unsigned int events;
941 static char *kwlist[] = {"fd", "eventmask", NULL};
942
943 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OI:modify", kwlist,
944 &pfd, &events)) {
945 return NULL;
946 }
947
948 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_MOD, pfd, events);
949}
950
951PyDoc_STRVAR(pyepoll_modify_doc,
952"modify(fd, eventmask) -> None\n\
953\n\
954fd is the target file descriptor of the operation\n\
955events is a bit set composed of the various EPOLL constants");
956
957static PyObject *
958pyepoll_unregister(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
959{
960 PyObject *pfd;
961 static char *kwlist[] = {"fd", NULL};
962
963 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:unregister", kwlist,
964 &pfd)) {
965 return NULL;
966 }
967
968 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_DEL, pfd, 0);
969}
970
971PyDoc_STRVAR(pyepoll_unregister_doc,
972"unregister(fd) -> None\n\
973\n\
974fd is the target file descriptor of the operation.");
975
976static PyObject *
977pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
978{
979 double dtimeout = -1.;
980 int timeout;
981 int maxevents = -1;
982 int nfds, i;
983 PyObject *elist = NULL, *etuple = NULL;
984 struct epoll_event *evs = NULL;
985 static char *kwlist[] = {"timeout", "maxevents", NULL};
986
987 if (self->epfd < 0)
988 return pyepoll_err_closed();
989
990 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|di:poll", kwlist,
991 &dtimeout, &maxevents)) {
992 return NULL;
993 }
994
995 if (dtimeout < 0) {
996 timeout = -1;
997 }
998 else if (dtimeout * 1000.0 > INT_MAX) {
999 PyErr_SetString(PyExc_OverflowError,
1000 "timeout is too large");
Christian Heimesf6cd9672008-03-26 13:45:42 +00001001 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001002 }
1003 else {
1004 timeout = (int)(dtimeout * 1000.0);
1005 }
1006
1007 if (maxevents == -1) {
1008 maxevents = FD_SETSIZE-1;
1009 }
1010 else if (maxevents < 1) {
1011 PyErr_Format(PyExc_ValueError,
1012 "maxevents must be greater than 0, got %d",
1013 maxevents);
1014 return NULL;
1015 }
1016
1017 evs = PyMem_New(struct epoll_event, maxevents);
1018 if (evs == NULL) {
1019 Py_DECREF(self);
1020 PyErr_NoMemory();
1021 return NULL;
1022 }
1023
1024 Py_BEGIN_ALLOW_THREADS
1025 nfds = epoll_wait(self->epfd, evs, maxevents, timeout);
1026 Py_END_ALLOW_THREADS
1027 if (nfds < 0) {
1028 PyErr_SetFromErrno(PyExc_IOError);
1029 goto error;
1030 }
1031
1032 elist = PyList_New(nfds);
1033 if (elist == NULL) {
1034 goto error;
1035 }
1036
1037 for (i = 0; i < nfds; i++) {
Christian Heimesf6cd9672008-03-26 13:45:42 +00001038 etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001039 if (etuple == NULL) {
Christian Heimesf6cd9672008-03-26 13:45:42 +00001040 Py_CLEAR(elist);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001041 goto error;
1042 }
1043 PyList_SET_ITEM(elist, i, etuple);
1044 }
1045
Christian Heimesf6cd9672008-03-26 13:45:42 +00001046 error:
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001047 PyMem_Free(evs);
1048 return elist;
1049}
1050
1051PyDoc_STRVAR(pyepoll_poll_doc,
1052"poll([timeout=-1[, maxevents=-1]]) -> [(fd, events), (...)]\n\
1053\n\
1054Wait for events on the epoll file descriptor for a maximum time of timeout\n\
1055in seconds (as float). -1 makes poll wait indefinitely.\n\
1056Up to maxevents are returned to the caller.");
1057
1058static PyMethodDef pyepoll_methods[] = {
1059 {"fromfd", (PyCFunction)pyepoll_fromfd,
1060 METH_VARARGS | METH_CLASS, pyepoll_fromfd_doc},
1061 {"close", (PyCFunction)pyepoll_close, METH_NOARGS,
1062 pyepoll_close_doc},
1063 {"fileno", (PyCFunction)pyepoll_fileno, METH_NOARGS,
1064 pyepoll_fileno_doc},
1065 {"modify", (PyCFunction)pyepoll_modify,
1066 METH_VARARGS | METH_KEYWORDS, pyepoll_modify_doc},
1067 {"register", (PyCFunction)pyepoll_register,
1068 METH_VARARGS | METH_KEYWORDS, pyepoll_register_doc},
1069 {"unregister", (PyCFunction)pyepoll_unregister,
1070 METH_VARARGS | METH_KEYWORDS, pyepoll_unregister_doc},
1071 {"poll", (PyCFunction)pyepoll_poll,
1072 METH_VARARGS | METH_KEYWORDS, pyepoll_poll_doc},
1073 {NULL, NULL},
1074};
1075
1076static PyGetSetDef pyepoll_getsetlist[] = {
1077 {"closed", (getter)pyepoll_get_closed, NULL,
1078 "True if the epoll handler is closed"},
1079 {0},
1080};
1081
1082PyDoc_STRVAR(pyepoll_doc,
1083"select.epoll([sizehint=-1])\n\
1084\n\
1085Returns an epolling object\n\
1086\n\
1087sizehint must be a positive integer or -1 for the default size. The\n\
1088sizehint is used to optimize internal data structures. It doesn't limit\n\
1089the maximum number of monitored events.");
1090
1091static PyTypeObject pyEpoll_Type = {
1092 PyVarObject_HEAD_INIT(NULL, 0)
1093 "select.epoll", /* tp_name */
1094 sizeof(pyEpoll_Object), /* tp_basicsize */
1095 0, /* tp_itemsize */
1096 (destructor)pyepoll_dealloc, /* tp_dealloc */
1097 0, /* tp_print */
1098 0, /* tp_getattr */
1099 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00001100 0, /* tp_reserved */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001101 0, /* tp_repr */
1102 0, /* tp_as_number */
1103 0, /* tp_as_sequence */
1104 0, /* tp_as_mapping */
1105 0, /* tp_hash */
1106 0, /* tp_call */
1107 0, /* tp_str */
1108 PyObject_GenericGetAttr, /* tp_getattro */
1109 0, /* tp_setattro */
1110 0, /* tp_as_buffer */
1111 Py_TPFLAGS_DEFAULT, /* tp_flags */
1112 pyepoll_doc, /* tp_doc */
1113 0, /* tp_traverse */
1114 0, /* tp_clear */
1115 0, /* tp_richcompare */
1116 0, /* tp_weaklistoffset */
1117 0, /* tp_iter */
1118 0, /* tp_iternext */
1119 pyepoll_methods, /* tp_methods */
1120 0, /* tp_members */
1121 pyepoll_getsetlist, /* tp_getset */
1122 0, /* tp_base */
1123 0, /* tp_dict */
1124 0, /* tp_descr_get */
1125 0, /* tp_descr_set */
1126 0, /* tp_dictoffset */
1127 0, /* tp_init */
1128 0, /* tp_alloc */
1129 pyepoll_new, /* tp_new */
1130 0, /* tp_free */
1131};
1132
1133#endif /* HAVE_EPOLL */
1134
1135#ifdef HAVE_KQUEUE
1136/* **************************************************************************
1137 * kqueue interface for BSD
1138 *
1139 * Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
1140 * All rights reserved.
1141 *
1142 * Redistribution and use in source and binary forms, with or without
1143 * modification, are permitted provided that the following conditions
1144 * are met:
1145 * 1. Redistributions of source code must retain the above copyright
1146 * notice, this list of conditions and the following disclaimer.
1147 * 2. Redistributions in binary form must reproduce the above copyright
1148 * notice, this list of conditions and the following disclaimer in the
1149 * documentation and/or other materials provided with the distribution.
1150 *
1151 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1152 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1153 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1154 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1155 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1156 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1157 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1158 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1159 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1160 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1161 * SUCH DAMAGE.
1162 */
1163
1164#ifdef HAVE_SYS_EVENT_H
1165#include <sys/event.h>
1166#endif
1167
1168PyDoc_STRVAR(kqueue_event_doc,
Benjamin Peterson1baf4652009-12-31 03:11:23 +00001169"kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001170\n\
1171This object is the equivalent of the struct kevent for the C API.\n\
1172\n\
1173See the kqueue manpage for more detailed information about the meaning\n\
1174of the arguments.\n\
1175\n\
1176One minor note: while you might hope that udata could store a\n\
1177reference to a python object, it cannot, because it is impossible to\n\
1178keep a proper reference count of the object once it's passed into the\n\
1179kernel. Therefore, I have restricted it to only storing an integer. I\n\
1180recommend ignoring it and simply using the 'ident' field to key off\n\
1181of. You could also set up a dictionary on the python side to store a\n\
1182udata->object mapping.");
1183
1184typedef struct {
1185 PyObject_HEAD
1186 struct kevent e;
1187} kqueue_event_Object;
1188
1189static PyTypeObject kqueue_event_Type;
1190
1191#define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type))
1192
1193typedef struct {
1194 PyObject_HEAD
1195 SOCKET kqfd; /* kqueue control fd */
1196} kqueue_queue_Object;
1197
1198static PyTypeObject kqueue_queue_Type;
1199
1200#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type))
1201
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001202#if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P)
1203# error uintptr_t does not match void *!
1204#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG)
1205# define T_UINTPTRT T_ULONGLONG
1206# define T_INTPTRT T_LONGLONG
1207# define PyLong_AsUintptr_t PyLong_AsUnsignedLongLong
1208# define UINTPTRT_FMT_UNIT "K"
1209# define INTPTRT_FMT_UNIT "L"
1210#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG)
1211# define T_UINTPTRT T_ULONG
1212# define T_INTPTRT T_LONG
1213# define PyLong_AsUintptr_t PyLong_AsUnsignedLong
1214# define UINTPTRT_FMT_UNIT "k"
1215# define INTPTRT_FMT_UNIT "l"
1216#elif (SIZEOF_UINTPTR_T == SIZEOF_INT)
1217# define T_UINTPTRT T_UINT
1218# define T_INTPTRT T_INT
1219# define PyLong_AsUintptr_t PyLong_AsUnsignedLong
1220# define UINTPTRT_FMT_UNIT "I"
1221# define INTPTRT_FMT_UNIT "i"
1222#else
1223# error uintptr_t does not match int, long, or long long!
1224#endif
1225
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001226/* Unfortunately, we can't store python objects in udata, because
1227 * kevents in the kernel can be removed without warning, which would
1228 * forever lose the refcount on the object stored with it.
1229 */
1230
1231#define KQ_OFF(x) offsetof(kqueue_event_Object, x)
1232static struct PyMemberDef kqueue_event_members[] = {
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001233 {"ident", T_UINTPTRT, KQ_OFF(e.ident)},
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001234 {"filter", T_SHORT, KQ_OFF(e.filter)},
1235 {"flags", T_USHORT, KQ_OFF(e.flags)},
1236 {"fflags", T_UINT, KQ_OFF(e.fflags)},
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001237 {"data", T_INTPTRT, KQ_OFF(e.data)},
1238 {"udata", T_UINTPTRT, KQ_OFF(e.udata)},
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001239 {NULL} /* Sentinel */
1240};
1241#undef KQ_OFF
1242
1243static PyObject *
Georg Brandlc0e22b72010-03-14 10:51:01 +00001244
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001245kqueue_event_repr(kqueue_event_Object *s)
1246{
1247 char buf[1024];
1248 PyOS_snprintf(
1249 buf, sizeof(buf),
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001250 "<select.kevent ident=%zu filter=%d flags=0x%x fflags=0x%x "
1251 "data=0x%zd udata=%p>",
1252 (size_t)(s->e.ident), s->e.filter, s->e.flags,
1253 s->e.fflags, (Py_ssize_t)(s->e.data), s->e.udata);
1254 return PyUnicode_FromString(buf);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001255}
1256
1257static int
1258kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds)
1259{
1260 PyObject *pfd;
1261 static char *kwlist[] = {"ident", "filter", "flags", "fflags",
1262 "data", "udata", NULL};
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001263 static char *fmt = "O|hhi" INTPTRT_FMT_UNIT UINTPTRT_FMT_UNIT ":kevent";
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001264
1265 EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
1266
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001267 if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist,
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001268 &pfd, &(self->e.filter), &(self->e.flags),
1269 &(self->e.fflags), &(self->e.data), &(self->e.udata))) {
1270 return -1;
1271 }
1272
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001273 if (PyLong_Check(pfd)) {
1274 self->e.ident = PyLong_AsUintptr_t(pfd);
1275 }
1276 else {
1277 self->e.ident = PyObject_AsFileDescriptor(pfd);
1278 }
1279 if (PyErr_Occurred()) {
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001280 return -1;
1281 }
1282 return 0;
1283}
1284
1285static PyObject *
1286kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
1287 int op)
1288{
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001289 Py_intptr_t result = 0;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001290
1291 if (!kqueue_event_Check(o)) {
1292 if (op == Py_EQ || op == Py_NE) {
1293 PyObject *res = op == Py_EQ ? Py_False : Py_True;
1294 Py_INCREF(res);
1295 return res;
1296 }
1297 PyErr_Format(PyExc_TypeError,
1298 "can't compare %.200s to %.200s",
1299 Py_TYPE(s)->tp_name, Py_TYPE(o)->tp_name);
1300 return NULL;
1301 }
1302 if (((result = s->e.ident - o->e.ident) == 0) &&
1303 ((result = s->e.filter - o->e.filter) == 0) &&
1304 ((result = s->e.flags - o->e.flags) == 0) &&
1305 ((result = s->e.fflags - o->e.fflags) == 0) &&
1306 ((result = s->e.data - o->e.data) == 0) &&
1307 ((result = s->e.udata - o->e.udata) == 0)
1308 ) {
1309 result = 0;
1310 }
1311
1312 switch (op) {
1313 case Py_EQ:
1314 result = (result == 0);
1315 break;
1316 case Py_NE:
1317 result = (result != 0);
1318 break;
1319 case Py_LE:
1320 result = (result <= 0);
1321 break;
1322 case Py_GE:
1323 result = (result >= 0);
1324 break;
1325 case Py_LT:
1326 result = (result < 0);
1327 break;
1328 case Py_GT:
1329 result = (result > 0);
1330 break;
1331 }
Antoine Pitroud83f1e62009-11-04 21:10:38 +00001332 return PyBool_FromLong((long)result);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001333}
1334
1335static PyTypeObject kqueue_event_Type = {
1336 PyVarObject_HEAD_INIT(NULL, 0)
1337 "select.kevent", /* tp_name */
1338 sizeof(kqueue_event_Object), /* tp_basicsize */
1339 0, /* tp_itemsize */
1340 0, /* tp_dealloc */
1341 0, /* tp_print */
1342 0, /* tp_getattr */
1343 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00001344 0, /* tp_reserved */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001345 (reprfunc)kqueue_event_repr, /* tp_repr */
1346 0, /* tp_as_number */
1347 0, /* tp_as_sequence */
1348 0, /* tp_as_mapping */
1349 0, /* tp_hash */
1350 0, /* tp_call */
1351 0, /* tp_str */
1352 0, /* tp_getattro */
1353 0, /* tp_setattro */
1354 0, /* tp_as_buffer */
1355 Py_TPFLAGS_DEFAULT, /* tp_flags */
1356 kqueue_event_doc, /* tp_doc */
1357 0, /* tp_traverse */
1358 0, /* tp_clear */
1359 (richcmpfunc)kqueue_event_richcompare, /* tp_richcompare */
1360 0, /* tp_weaklistoffset */
1361 0, /* tp_iter */
1362 0, /* tp_iternext */
1363 0, /* tp_methods */
1364 kqueue_event_members, /* tp_members */
1365 0, /* tp_getset */
1366 0, /* tp_base */
1367 0, /* tp_dict */
1368 0, /* tp_descr_get */
1369 0, /* tp_descr_set */
1370 0, /* tp_dictoffset */
1371 (initproc)kqueue_event_init, /* tp_init */
1372 0, /* tp_alloc */
1373 0, /* tp_new */
1374 0, /* tp_free */
1375};
1376
1377static PyObject *
1378kqueue_queue_err_closed(void)
1379{
1380 PyErr_SetString(PyExc_ValueError, "I/O operation on closed kqueue fd");
1381 return NULL;
1382}
1383
1384static int
1385kqueue_queue_internal_close(kqueue_queue_Object *self)
1386{
1387 int save_errno = 0;
1388 if (self->kqfd >= 0) {
1389 int kqfd = self->kqfd;
1390 self->kqfd = -1;
1391 Py_BEGIN_ALLOW_THREADS
1392 if (close(kqfd) < 0)
1393 save_errno = errno;
1394 Py_END_ALLOW_THREADS
1395 }
1396 return save_errno;
1397}
1398
1399static PyObject *
1400newKqueue_Object(PyTypeObject *type, SOCKET fd)
1401{
1402 kqueue_queue_Object *self;
1403 assert(type != NULL && type->tp_alloc != NULL);
1404 self = (kqueue_queue_Object *) type->tp_alloc(type, 0);
1405 if (self == NULL) {
1406 return NULL;
1407 }
1408
1409 if (fd == -1) {
1410 Py_BEGIN_ALLOW_THREADS
1411 self->kqfd = kqueue();
1412 Py_END_ALLOW_THREADS
1413 }
1414 else {
1415 self->kqfd = fd;
1416 }
1417 if (self->kqfd < 0) {
1418 Py_DECREF(self);
1419 PyErr_SetFromErrno(PyExc_IOError);
1420 return NULL;
1421 }
1422 return (PyObject *)self;
1423}
1424
1425static PyObject *
1426kqueue_queue_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1427{
1428
1429 if ((args != NULL && PyObject_Size(args)) ||
1430 (kwds != NULL && PyObject_Size(kwds))) {
1431 PyErr_SetString(PyExc_ValueError,
1432 "select.kqueue doesn't accept arguments");
1433 return NULL;
1434 }
1435
1436 return newKqueue_Object(type, -1);
1437}
1438
1439static void
1440kqueue_queue_dealloc(kqueue_queue_Object *self)
1441{
1442 kqueue_queue_internal_close(self);
1443 Py_TYPE(self)->tp_free(self);
1444}
1445
1446static PyObject*
1447kqueue_queue_close(kqueue_queue_Object *self)
1448{
1449 errno = kqueue_queue_internal_close(self);
1450 if (errno < 0) {
1451 PyErr_SetFromErrno(PyExc_IOError);
1452 return NULL;
1453 }
1454 Py_RETURN_NONE;
1455}
1456
1457PyDoc_STRVAR(kqueue_queue_close_doc,
1458"close() -> None\n\
1459\n\
1460Close the kqueue control file descriptor. Further operations on the kqueue\n\
1461object will raise an exception.");
1462
1463static PyObject*
1464kqueue_queue_get_closed(kqueue_queue_Object *self)
1465{
1466 if (self->kqfd < 0)
1467 Py_RETURN_TRUE;
1468 else
1469 Py_RETURN_FALSE;
1470}
1471
1472static PyObject*
1473kqueue_queue_fileno(kqueue_queue_Object *self)
1474{
1475 if (self->kqfd < 0)
1476 return kqueue_queue_err_closed();
1477 return PyLong_FromLong(self->kqfd);
1478}
1479
1480PyDoc_STRVAR(kqueue_queue_fileno_doc,
1481"fileno() -> int\n\
1482\n\
1483Return the kqueue control file descriptor.");
1484
1485static PyObject*
1486kqueue_queue_fromfd(PyObject *cls, PyObject *args)
1487{
1488 SOCKET fd;
1489
1490 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
1491 return NULL;
1492
1493 return newKqueue_Object((PyTypeObject*)cls, fd);
1494}
1495
1496PyDoc_STRVAR(kqueue_queue_fromfd_doc,
1497"fromfd(fd) -> kqueue\n\
1498\n\
1499Create a kqueue object from a given control fd.");
1500
1501static PyObject *
1502kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
1503{
1504 int nevents = 0;
1505 int gotevents = 0;
1506 int nchanges = 0;
1507 int i = 0;
1508 PyObject *otimeout = NULL;
1509 PyObject *ch = NULL;
1510 PyObject *it = NULL, *ei = NULL;
1511 PyObject *result = NULL;
1512 struct kevent *evl = NULL;
1513 struct kevent *chl = NULL;
1514 struct timespec timeoutspec;
1515 struct timespec *ptimeoutspec;
1516
1517 if (self->kqfd < 0)
1518 return kqueue_queue_err_closed();
1519
1520 if (!PyArg_ParseTuple(args, "Oi|O:control", &ch, &nevents, &otimeout))
1521 return NULL;
1522
1523 if (nevents < 0) {
1524 PyErr_Format(PyExc_ValueError,
1525 "Length of eventlist must be 0 or positive, got %d",
Alexandre Vassalottie52e3782009-07-17 09:18:18 +00001526 nevents);
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001527 return NULL;
1528 }
1529
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001530 if (otimeout == Py_None || otimeout == NULL) {
1531 ptimeoutspec = NULL;
1532 }
1533 else if (PyNumber_Check(otimeout)) {
1534 double timeout;
1535 long seconds;
1536
1537 timeout = PyFloat_AsDouble(otimeout);
1538 if (timeout == -1 && PyErr_Occurred())
1539 return NULL;
1540 if (timeout > (double)LONG_MAX) {
1541 PyErr_SetString(PyExc_OverflowError,
1542 "timeout period too long");
1543 return NULL;
1544 }
1545 if (timeout < 0) {
1546 PyErr_SetString(PyExc_ValueError,
1547 "timeout must be positive or None");
1548 return NULL;
1549 }
1550
1551 seconds = (long)timeout;
1552 timeout = timeout - (double)seconds;
1553 timeoutspec.tv_sec = seconds;
1554 timeoutspec.tv_nsec = (long)(timeout * 1E9);
1555 ptimeoutspec = &timeoutspec;
1556 }
1557 else {
1558 PyErr_Format(PyExc_TypeError,
1559 "timeout argument must be an number "
1560 "or None, got %.200s",
1561 Py_TYPE(otimeout)->tp_name);
1562 return NULL;
1563 }
1564
Georg Brandlc0e22b72010-03-14 10:51:01 +00001565 if (ch != NULL && ch != Py_None) {
1566 it = PyObject_GetIter(ch);
1567 if (it == NULL) {
1568 PyErr_SetString(PyExc_TypeError,
1569 "changelist is not iterable");
1570 return NULL;
1571 }
1572 nchanges = PyObject_Size(ch);
1573 if (nchanges < 0) {
1574 goto error;
1575 }
1576
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001577 chl = PyMem_New(struct kevent, nchanges);
1578 if (chl == NULL) {
1579 PyErr_NoMemory();
Georg Brandlc0e22b72010-03-14 10:51:01 +00001580 goto error;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001581 }
Alexandre Vassalottie52e3782009-07-17 09:18:18 +00001582 i = 0;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001583 while ((ei = PyIter_Next(it)) != NULL) {
1584 if (!kqueue_event_Check(ei)) {
1585 Py_DECREF(ei);
1586 PyErr_SetString(PyExc_TypeError,
1587 "changelist must be an iterable of "
1588 "select.kevent objects");
1589 goto error;
1590 } else {
Alexandre Vassalottie52e3782009-07-17 09:18:18 +00001591 chl[i++] = ((kqueue_event_Object *)ei)->e;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001592 }
1593 Py_DECREF(ei);
1594 }
1595 }
1596 Py_CLEAR(it);
1597
1598 /* event list */
1599 if (nevents) {
1600 evl = PyMem_New(struct kevent, nevents);
1601 if (evl == NULL) {
1602 PyErr_NoMemory();
Georg Brandlc0e22b72010-03-14 10:51:01 +00001603 goto error;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001604 }
1605 }
1606
1607 Py_BEGIN_ALLOW_THREADS
1608 gotevents = kevent(self->kqfd, chl, nchanges,
1609 evl, nevents, ptimeoutspec);
1610 Py_END_ALLOW_THREADS
1611
1612 if (gotevents == -1) {
1613 PyErr_SetFromErrno(PyExc_OSError);
1614 goto error;
1615 }
1616
1617 result = PyList_New(gotevents);
1618 if (result == NULL) {
1619 goto error;
1620 }
1621
Alexandre Vassalottie52e3782009-07-17 09:18:18 +00001622 for (i = 0; i < gotevents; i++) {
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001623 kqueue_event_Object *ch;
1624
1625 ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type);
1626 if (ch == NULL) {
1627 goto error;
1628 }
1629 ch->e = evl[i];
1630 PyList_SET_ITEM(result, i, (PyObject *)ch);
1631 }
1632 PyMem_Free(chl);
1633 PyMem_Free(evl);
1634 return result;
1635
1636 error:
1637 PyMem_Free(chl);
1638 PyMem_Free(evl);
1639 Py_XDECREF(result);
1640 Py_XDECREF(it);
1641 return NULL;
1642}
1643
1644PyDoc_STRVAR(kqueue_queue_control_doc,
Benjamin Peterson9bc93512008-09-22 22:10:59 +00001645"control(changelist, max_events[, timeout=None]) -> eventlist\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001646\n\
1647Calls the kernel kevent function.\n\
1648- changelist must be a list of kevent objects describing the changes\n\
1649 to be made to the kernel's watch list or None.\n\
1650- max_events lets you specify the maximum number of events that the\n\
1651 kernel will return.\n\
1652- timeout is the maximum time to wait in seconds, or else None,\n\
1653 to wait forever. timeout accepts floats for smaller timeouts, too.");
1654
1655
1656static PyMethodDef kqueue_queue_methods[] = {
1657 {"fromfd", (PyCFunction)kqueue_queue_fromfd,
1658 METH_VARARGS | METH_CLASS, kqueue_queue_fromfd_doc},
1659 {"close", (PyCFunction)kqueue_queue_close, METH_NOARGS,
1660 kqueue_queue_close_doc},
1661 {"fileno", (PyCFunction)kqueue_queue_fileno, METH_NOARGS,
1662 kqueue_queue_fileno_doc},
1663 {"control", (PyCFunction)kqueue_queue_control,
1664 METH_VARARGS , kqueue_queue_control_doc},
1665 {NULL, NULL},
1666};
1667
1668static PyGetSetDef kqueue_queue_getsetlist[] = {
1669 {"closed", (getter)kqueue_queue_get_closed, NULL,
1670 "True if the kqueue handler is closed"},
1671 {0},
1672};
1673
1674PyDoc_STRVAR(kqueue_queue_doc,
1675"Kqueue syscall wrapper.\n\
1676\n\
1677For example, to start watching a socket for input:\n\
1678>>> kq = kqueue()\n\
1679>>> sock = socket()\n\
1680>>> sock.connect((host, port))\n\
1681>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_ADD)], 0)\n\
1682\n\
1683To wait one second for it to become writeable:\n\
1684>>> kq.control(None, 1, 1000)\n\
1685\n\
1686To stop listening:\n\
1687>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_DELETE)], 0)");
1688
1689static PyTypeObject kqueue_queue_Type = {
1690 PyVarObject_HEAD_INIT(NULL, 0)
1691 "select.kqueue", /* tp_name */
1692 sizeof(kqueue_queue_Object), /* tp_basicsize */
1693 0, /* tp_itemsize */
1694 (destructor)kqueue_queue_dealloc, /* tp_dealloc */
1695 0, /* tp_print */
1696 0, /* tp_getattr */
1697 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00001698 0, /* tp_reserved */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001699 0, /* tp_repr */
1700 0, /* tp_as_number */
1701 0, /* tp_as_sequence */
1702 0, /* tp_as_mapping */
1703 0, /* tp_hash */
1704 0, /* tp_call */
1705 0, /* tp_str */
1706 0, /* tp_getattro */
1707 0, /* tp_setattro */
1708 0, /* tp_as_buffer */
1709 Py_TPFLAGS_DEFAULT, /* tp_flags */
1710 kqueue_queue_doc, /* tp_doc */
1711 0, /* tp_traverse */
1712 0, /* tp_clear */
1713 0, /* tp_richcompare */
1714 0, /* tp_weaklistoffset */
1715 0, /* tp_iter */
1716 0, /* tp_iternext */
1717 kqueue_queue_methods, /* tp_methods */
1718 0, /* tp_members */
1719 kqueue_queue_getsetlist, /* tp_getset */
1720 0, /* tp_base */
1721 0, /* tp_dict */
1722 0, /* tp_descr_get */
1723 0, /* tp_descr_set */
1724 0, /* tp_dictoffset */
1725 0, /* tp_init */
1726 0, /* tp_alloc */
1727 kqueue_queue_new, /* tp_new */
1728 0, /* tp_free */
1729};
1730
1731#endif /* HAVE_KQUEUE */
1732/* ************************************************************************ */
1733
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001734PyDoc_STRVAR(select_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001735"select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
1736\n\
1737Wait until one or more file descriptors are ready for some kind of I/O.\n\
Brett Cannon62dba4c2003-09-10 19:37:42 +00001738The first three arguments are sequences of file descriptors to be waited for:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001739rlist -- wait until ready for reading\n\
1740wlist -- wait until ready for writing\n\
1741xlist -- wait for an ``exceptional condition''\n\
1742If only one kind of condition is required, pass [] for the other lists.\n\
1743A file descriptor is either a socket or file object, or a small integer\n\
1744gotten from a fileno() method call on one of those.\n\
1745\n\
1746The optional 4th argument specifies a timeout in seconds; it may be\n\
1747a floating point number to specify fractions of seconds. If it is absent\n\
1748or None, the call will never time out.\n\
1749\n\
1750The return value is a tuple of three lists corresponding to the first three\n\
1751arguments; each contains the subset of the corresponding file descriptors\n\
1752that are ready.\n\
1753\n\
1754*** IMPORTANT NOTICE ***\n\
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001755On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\
Christian Heimesf6cd9672008-03-26 13:45:42 +00001756descriptors can be used.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001757
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00001758static PyMethodDef select_methods[] = {
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001759 {"select", select_select, METH_VARARGS, select_doc},
1760#ifdef HAVE_POLL
1761 {"poll", select_poll, METH_NOARGS, poll_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001762#endif /* HAVE_POLL */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001763 {0, 0}, /* sentinel */
Guido van Rossumed233a51992-06-23 09:07:03 +00001764};
1765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001766PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001767"This module supports asynchronous I/O on multiple file descriptors.\n\
1768\n\
1769*** IMPORTANT NOTICE ***\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001770On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.");
Guido van Rossumed233a51992-06-23 09:07:03 +00001771
Martin v. Löwis1a214512008-06-11 05:26:20 +00001772
1773static struct PyModuleDef selectmodule = {
1774 PyModuleDef_HEAD_INIT,
1775 "select",
1776 module_doc,
1777 -1,
1778 select_methods,
1779 NULL,
1780 NULL,
1781 NULL,
1782 NULL
1783};
1784
Mark Hammond62b1ab12002-07-23 06:31:15 +00001785PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001786PyInit_select(void)
Guido van Rossumed233a51992-06-23 09:07:03 +00001787{
Fred Drake4baedc12002-04-01 14:53:37 +00001788 PyObject *m;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001789 m = PyModule_Create(&selectmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001790 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001791 return NULL;
Fred Drake4baedc12002-04-01 14:53:37 +00001792
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001793 SelectError = PyErr_NewException("select.error", NULL, NULL);
Fred Drake4baedc12002-04-01 14:53:37 +00001794 Py_INCREF(SelectError);
1795 PyModule_AddObject(m, "error", SelectError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001796
Amaury Forgeot d'Arcace31022009-07-09 22:44:11 +00001797#ifdef PIPE_BUF
Gregory P. Smithb970b862009-07-04 02:28:47 +00001798 PyModule_AddIntConstant(m, "PIPE_BUF", PIPE_BUF);
Amaury Forgeot d'Arcace31022009-07-09 22:44:11 +00001799#endif
Gregory P. Smithb970b862009-07-04 02:28:47 +00001800
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001801#if defined(HAVE_POLL)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001802#ifdef __APPLE__
1803 if (select_have_broken_poll()) {
1804 if (PyObject_DelAttrString(m, "poll") == -1) {
1805 PyErr_Clear();
1806 }
1807 } else {
1808#else
1809 {
1810#endif
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001811 if (PyType_Ready(&poll_Type) < 0)
1812 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001813 PyModule_AddIntConstant(m, "POLLIN", POLLIN);
1814 PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
1815 PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
1816 PyModule_AddIntConstant(m, "POLLERR", POLLERR);
1817 PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
1818 PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +00001819
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001820#ifdef POLLRDNORM
Thomas Wouters477c8d52006-05-27 19:21:47 +00001821 PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001822#endif
1823#ifdef POLLRDBAND
Thomas Wouters477c8d52006-05-27 19:21:47 +00001824 PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001825#endif
1826#ifdef POLLWRNORM
Thomas Wouters477c8d52006-05-27 19:21:47 +00001827 PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001828#endif
1829#ifdef POLLWRBAND
Thomas Wouters477c8d52006-05-27 19:21:47 +00001830 PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001831#endif
Sjoerd Mullender239f8362000-08-25 13:59:18 +00001832#ifdef POLLMSG
Thomas Wouters477c8d52006-05-27 19:21:47 +00001833 PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
Sjoerd Mullender239f8362000-08-25 13:59:18 +00001834#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835 }
1836#endif /* HAVE_POLL */
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001837
1838#ifdef HAVE_EPOLL
1839 Py_TYPE(&pyEpoll_Type) = &PyType_Type;
1840 if (PyType_Ready(&pyEpoll_Type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001841 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001842
1843 Py_INCREF(&pyEpoll_Type);
1844 PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type);
1845
1846 PyModule_AddIntConstant(m, "EPOLLIN", EPOLLIN);
1847 PyModule_AddIntConstant(m, "EPOLLOUT", EPOLLOUT);
1848 PyModule_AddIntConstant(m, "EPOLLPRI", EPOLLPRI);
1849 PyModule_AddIntConstant(m, "EPOLLERR", EPOLLERR);
1850 PyModule_AddIntConstant(m, "EPOLLHUP", EPOLLHUP);
1851 PyModule_AddIntConstant(m, "EPOLLET", EPOLLET);
1852#ifdef EPOLLONESHOT
1853 /* Kernel 2.6.2+ */
1854 PyModule_AddIntConstant(m, "EPOLLONESHOT", EPOLLONESHOT);
1855#endif
1856 /* PyModule_AddIntConstant(m, "EPOLL_RDHUP", EPOLLRDHUP); */
1857 PyModule_AddIntConstant(m, "EPOLLRDNORM", EPOLLRDNORM);
1858 PyModule_AddIntConstant(m, "EPOLLRDBAND", EPOLLRDBAND);
1859 PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
1860 PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
1861 PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
1862#endif /* HAVE_EPOLL */
1863
1864#ifdef HAVE_KQUEUE
1865 kqueue_event_Type.tp_new = PyType_GenericNew;
1866 Py_TYPE(&kqueue_event_Type) = &PyType_Type;
1867 if(PyType_Ready(&kqueue_event_Type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001868 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001869
1870 Py_INCREF(&kqueue_event_Type);
1871 PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type);
1872
1873 Py_TYPE(&kqueue_queue_Type) = &PyType_Type;
1874 if(PyType_Ready(&kqueue_queue_Type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001875 return NULL;
Christian Heimes4fbc72b2008-03-22 00:47:35 +00001876 Py_INCREF(&kqueue_queue_Type);
1877 PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type);
1878
1879 /* event filters */
1880 PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
1881 PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE);
1882 PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO);
1883 PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE);
1884 PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC);
1885#ifdef EVFILT_NETDEV
1886 PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV);
1887#endif
1888 PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
1889 PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER);
1890
1891 /* event flags */
1892 PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD);
1893 PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE);
1894 PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE);
1895 PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE);
1896 PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT);
1897 PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR);
1898
1899 PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS);
1900 PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1);
1901
1902 PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF);
1903 PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR);
1904
1905 /* READ WRITE filter flag */
1906 PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT);
1907
1908 /* VNODE filter flags */
1909 PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE);
1910 PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE);
1911 PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND);
1912 PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB);
1913 PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK);
1914 PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME);
1915 PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE);
1916
1917 /* PROC filter flags */
1918 PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT);
1919 PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK);
1920 PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC);
1921 PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
1922 PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
1923
1924 PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK);
1925 PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD);
1926 PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR);
1927
1928 /* NETDEV filter flags */
1929#ifdef EVFILT_NETDEV
1930 PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP);
1931 PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
1932 PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV);
1933#endif
1934
1935#endif /* HAVE_KQUEUE */
Martin v. Löwis1a214512008-06-11 05:26:20 +00001936 return m;
Guido van Rossumed233a51992-06-23 09:07:03 +00001937}