blob: 09c687c9603680e4c70a695644c4d0439906bb42 [file] [log] [blame]
Guido van Rossum4f0fbf81996-06-12 04:22:53 +00001/* select - Module containing unix select(2) call.
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00002 Under Unix, the file descriptors are small integers.
3 Under Win32, select only exists for sockets, and sockets may
4 have any value except INVALID_SOCKET.
Guido van Rossumbcc20741998-08-04 22:53:56 +00005 Under BeOS, we suffer the same dichotomy as Win32; sockets can be anything
6 >= 0.
Guido van Rossum4f0fbf81996-06-12 04:22:53 +00007*/
Guido van Rossumed233a51992-06-23 09:07:03 +00008
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00009#include "Python.h"
Christian Heimes0e9ab5f2008-03-21 23:49:44 +000010#include <structmember.h>
Guido van Rossumed233a51992-06-23 09:07:03 +000011
Ronald Oussoren32fd16e2006-04-23 12:36:23 +000012#ifdef __APPLE__
13 /* Perform runtime testing for a broken poll on OSX to make it easier
14 * to use the same binary on multiple releases of the OS.
15 */
16#undef HAVE_BROKEN_POLL
17#endif
18
Tim Petersd92dfe02000-12-12 01:18:41 +000019/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
20 64 is too small (too many people have bumped into that limit).
21 Here we boost it.
22 Users who want even more than the boosted limit should #define
23 FD_SETSIZE higher before this; e.g., via compiler /D switch.
24*/
25#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
26#define FD_SETSIZE 512
27#endif
28
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000029#if defined(HAVE_POLL_H)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000030#include <poll.h>
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000031#elif defined(HAVE_SYS_POLL_H)
32#include <sys/poll.h>
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000033#endif
Guido van Rossuma376cc51996-12-05 23:43:35 +000034
Guido van Rossum37273171996-12-09 18:47:43 +000035#ifdef __sgi
36/* This is missing from unistd.h */
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000037extern void bzero(void *, int);
Guido van Rossum37273171996-12-09 18:47:43 +000038#endif
39
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000040#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000041#include <sys/types.h>
Guido van Rossumff7e83d1999-08-27 20:39:37 +000042#endif
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000043
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000044#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000045#include <sys/time.h>
46#include <utils.h>
47#endif
48
Guido van Rossum6f489d91996-06-28 20:15:15 +000049#ifdef MS_WINDOWS
Neal Norwitz2a30cd02006-07-10 01:18:57 +000050# include <winsock.h>
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000051#else
Neal Norwitz2a30cd02006-07-10 01:18:57 +000052# define SOCKET int
53# ifdef __BEOS__
54# include <net/socket.h>
55# elif defined(__VMS)
56# include <socket.h>
57# endif
Guido van Rossumbcc20741998-08-04 22:53:56 +000058#endif
Guido van Rossumed233a51992-06-23 09:07:03 +000059
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000060static PyObject *SelectError;
Guido van Rossumed233a51992-06-23 09:07:03 +000061
Barry Warsawc1cb3601996-12-12 22:16:21 +000062/* list of Python objects and their file descriptor */
63typedef struct {
64 PyObject *obj; /* owned reference */
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000065 SOCKET fd;
Barry Warsawc1cb3601996-12-12 22:16:21 +000066 int sentinel; /* -1 == sentinel */
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000067} pylist;
68
Barry Warsawc1cb3601996-12-12 22:16:21 +000069static void
Tim Peters4b046c22001-08-16 21:59:46 +000070reap_obj(pylist fd2obj[FD_SETSIZE + 1])
Barry Warsawc1cb3601996-12-12 22:16:21 +000071{
72 int i;
Tim Peters4b046c22001-08-16 21:59:46 +000073 for (i = 0; i < FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) {
Barry Warsawc1cb3601996-12-12 22:16:21 +000074 Py_XDECREF(fd2obj[i].obj);
75 fd2obj[i].obj = NULL;
76 }
77 fd2obj[0].sentinel = -1;
78}
79
80
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000081/* returns -1 and sets the Python exception if an error occurred, otherwise
82 returns a number >= 0
83*/
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000084static int
Brett Cannon62dba4c2003-09-10 19:37:42 +000085seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +000086{
Barry Warsawc1cb3601996-12-12 22:16:21 +000087 int i;
88 int max = -1;
89 int index = 0;
Brett Cannon62dba4c2003-09-10 19:37:42 +000090 int len = -1;
91 PyObject* fast_seq = NULL;
Barry Warsawc1cb3601996-12-12 22:16:21 +000092 PyObject* o = NULL;
Guido van Rossum07432c01995-03-29 16:47:45 +000093
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000094 fd2obj[0].obj = (PyObject*)0; /* set list to zero size */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000095 FD_ZERO(set);
Barry Warsawc1cb3601996-12-12 22:16:21 +000096
Brett Cannon62dba4c2003-09-10 19:37:42 +000097 fast_seq=PySequence_Fast(seq, "arguments 1-3 must be sequences");
98 if (!fast_seq)
99 return -1;
100
101 len = PySequence_Fast_GET_SIZE(fast_seq);
102
Barry Warsawc1cb3601996-12-12 22:16:21 +0000103 for (i = 0; i < len; i++) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000104 SOCKET v;
105
106 /* any intervening fileno() calls could decr this refcnt */
Brett Cannon62dba4c2003-09-10 19:37:42 +0000107 if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i)))
Barry Warsaw529fcfe1996-12-16 18:15:34 +0000108 return -1;
Barry Warsaw24c4b3d1996-12-13 23:22:42 +0000109
Barry Warsawc1cb3601996-12-12 22:16:21 +0000110 Py_INCREF(o);
Andrew M. Kuchling9f28a032000-07-13 23:59:35 +0000111 v = PyObject_AsFileDescriptor( o );
112 if (v == -1) goto finally;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000113
Guido van Rossum947a0fa2000-01-14 16:33:09 +0000114#if defined(_MSC_VER)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000115 max = 0; /* not used for Win32 */
116#else /* !_MSC_VER */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000117 if (v < 0 || v >= FD_SETSIZE) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000118 PyErr_SetString(PyExc_ValueError,
119 "filedescriptor out of range in select()");
120 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000121 }
122 if (v > max)
123 max = v;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000124#endif /* _MSC_VER */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000125 FD_SET(v, set);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000126
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000127 /* add object and its file descriptor to the list */
128 if (index >= FD_SETSIZE) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000129 PyErr_SetString(PyExc_ValueError,
130 "too many file descriptors in select()");
131 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000132 }
133 fd2obj[index].obj = o;
134 fd2obj[index].fd = v;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000135 fd2obj[index].sentinel = 0;
136 fd2obj[++index].sentinel = -1;
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000137 }
Brett Cannon62dba4c2003-09-10 19:37:42 +0000138 Py_DECREF(fast_seq);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000139 return max+1;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000140
141 finally:
142 Py_XDECREF(o);
Brett Cannon62dba4c2003-09-10 19:37:42 +0000143 Py_DECREF(fast_seq);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000144 return -1;
Guido van Rossumed233a51992-06-23 09:07:03 +0000145}
146
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000147/* returns NULL and sets the Python exception if an error occurred */
148static PyObject *
Tim Peters4b046c22001-08-16 21:59:46 +0000149set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +0000150{
Barry Warsawc1cb3601996-12-12 22:16:21 +0000151 int i, j, count=0;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000152 PyObject *list, *o;
153 SOCKET fd;
Guido van Rossumed233a51992-06-23 09:07:03 +0000154
Barry Warsawc1cb3601996-12-12 22:16:21 +0000155 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000156 if (FD_ISSET(fd2obj[j].fd, set))
Barry Warsawc1cb3601996-12-12 22:16:21 +0000157 count++;
158 }
159 list = PyList_New(count);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000160 if (!list)
161 return NULL;
162
Barry Warsawc1cb3601996-12-12 22:16:21 +0000163 i = 0;
164 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000165 fd = fd2obj[j].fd;
166 if (FD_ISSET(fd, set)) {
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000167#ifndef _MSC_VER
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000168 if (fd > FD_SETSIZE) {
169 PyErr_SetString(PyExc_SystemError,
170 "filedescriptor out of range returned in select()");
Barry Warsawc1cb3601996-12-12 22:16:21 +0000171 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000172 }
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000173#endif
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000174 o = fd2obj[j].obj;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000175 fd2obj[j].obj = NULL;
176 /* transfer ownership */
177 if (PyList_SetItem(list, i, o) < 0)
178 goto finally;
179
180 i++;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000181 }
182 }
183 return list;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000184 finally:
185 Py_DECREF(list);
186 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000187}
Barry Warsawc1cb3601996-12-12 22:16:21 +0000188
Barry Warsawb44740f2001-08-16 16:52:59 +0000189#undef SELECT_USES_HEAP
190#if FD_SETSIZE > 1024
191#define SELECT_USES_HEAP
192#endif /* FD_SETSIZE > 1024 */
193
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000194static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000195select_select(PyObject *self, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000196{
Barry Warsawb44740f2001-08-16 16:52:59 +0000197#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000198 pylist *rfd2obj, *wfd2obj, *efd2obj;
Barry Warsawb44740f2001-08-16 16:52:59 +0000199#else /* !SELECT_USES_HEAP */
Tim Peters4b046c22001-08-16 21:59:46 +0000200 /* XXX: All this should probably be implemented as follows:
Barry Warsawb44740f2001-08-16 16:52:59 +0000201 * - find the highest descriptor we're interested in
202 * - add one
203 * - that's the size
204 * See: Stevens, APitUE, $12.5.1
205 */
Tim Peters4b046c22001-08-16 21:59:46 +0000206 pylist rfd2obj[FD_SETSIZE + 1];
207 pylist wfd2obj[FD_SETSIZE + 1];
208 pylist efd2obj[FD_SETSIZE + 1];
Barry Warsawb44740f2001-08-16 16:52:59 +0000209#endif /* SELECT_USES_HEAP */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000210 PyObject *ifdlist, *ofdlist, *efdlist;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000211 PyObject *ret = NULL;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000212 PyObject *tout = Py_None;
213 fd_set ifdset, ofdset, efdset;
214 double timeout;
215 struct timeval tv, *tvp;
Guido van Rossum3262e162000-06-28 21:18:13 +0000216 long seconds;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000217 int imax, omax, emax, max;
218 int n;
Guido van Rossumed233a51992-06-23 09:07:03 +0000219
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000220 /* convert arguments */
Georg Brandl96a8c392006-05-29 21:04:52 +0000221 if (!PyArg_UnpackTuple(args, "select", 3, 4,
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000222 &ifdlist, &ofdlist, &efdlist, &tout))
223 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000224
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000225 if (tout == Py_None)
226 tvp = (struct timeval *)0;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000227 else if (!PyNumber_Check(tout)) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000228 PyErr_SetString(PyExc_TypeError,
229 "timeout must be a float or None");
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000230 return NULL;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000231 }
Guido van Rossumc7a22701993-11-01 16:27:16 +0000232 else {
Neil Schemenauer47ec6c02002-11-18 16:02:29 +0000233 timeout = PyFloat_AsDouble(tout);
234 if (timeout == -1 && PyErr_Occurred())
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000235 return NULL;
Guido van Rossum3262e162000-06-28 21:18:13 +0000236 if (timeout > (double)LONG_MAX) {
Barry Warsaw2f704552001-08-16 16:55:10 +0000237 PyErr_SetString(PyExc_OverflowError,
238 "timeout period too long");
Guido van Rossum3262e162000-06-28 21:18:13 +0000239 return NULL;
240 }
241 seconds = (long)timeout;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000242 timeout = timeout - (double)seconds;
243 tv.tv_sec = seconds;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000244 tv.tv_usec = (long)(timeout * 1E6);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000245 tvp = &tv;
Guido van Rossumc7a22701993-11-01 16:27:16 +0000246 }
Guido van Rossumed233a51992-06-23 09:07:03 +0000247
Guido van Rossumed233a51992-06-23 09:07:03 +0000248
Barry Warsawb44740f2001-08-16 16:52:59 +0000249#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000250 /* Allocate memory for the lists */
Tim Peters4b046c22001-08-16 21:59:46 +0000251 rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
252 wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
253 efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
Guido van Rossumd20781b1998-07-02 02:53:36 +0000254 if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000255 if (rfd2obj) PyMem_DEL(rfd2obj);
256 if (wfd2obj) PyMem_DEL(wfd2obj);
257 if (efd2obj) PyMem_DEL(efd2obj);
Tim Peters5f322d32003-02-11 17:18:58 +0000258 return PyErr_NoMemory();
Guido van Rossumd20781b1998-07-02 02:53:36 +0000259 }
Barry Warsawb44740f2001-08-16 16:52:59 +0000260#endif /* SELECT_USES_HEAP */
Brett Cannon62dba4c2003-09-10 19:37:42 +0000261 /* Convert sequences to fd_sets, and get maximum fd number
262 * propagates the Python exception set in seq2set()
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000263 */
Barry Warsawc1cb3601996-12-12 22:16:21 +0000264 rfd2obj[0].sentinel = -1;
265 wfd2obj[0].sentinel = -1;
266 efd2obj[0].sentinel = -1;
Brett Cannon62dba4c2003-09-10 19:37:42 +0000267 if ((imax=seq2set(ifdlist, &ifdset, rfd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000268 goto finally;
Brett Cannon62dba4c2003-09-10 19:37:42 +0000269 if ((omax=seq2set(ofdlist, &ofdset, wfd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000270 goto finally;
Brett Cannon62dba4c2003-09-10 19:37:42 +0000271 if ((emax=seq2set(efdlist, &efdset, efd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000272 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000273 max = imax;
274 if (omax > max) max = omax;
275 if (emax > max) max = emax;
Guido van Rossumed233a51992-06-23 09:07:03 +0000276
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000277 Py_BEGIN_ALLOW_THREADS
278 n = select(max, &ifdset, &ofdset, &efdset, tvp);
279 Py_END_ALLOW_THREADS
Guido van Rossumed233a51992-06-23 09:07:03 +0000280
Thomas Heller106f4c72002-09-24 16:51:00 +0000281#ifdef MS_WINDOWS
282 if (n == SOCKET_ERROR) {
283 PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError());
284 }
285#else
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000286 if (n < 0) {
287 PyErr_SetFromErrno(SelectError);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000288 }
Thomas Heller106f4c72002-09-24 16:51:00 +0000289#endif
Barry Warsawc1cb3601996-12-12 22:16:21 +0000290 else {
291 /* any of these three calls can raise an exception. it's more
292 convenient to test for this after all three calls... but
293 is that acceptable?
294 */
295 ifdlist = set2list(&ifdset, rfd2obj);
296 ofdlist = set2list(&ofdset, wfd2obj);
297 efdlist = set2list(&efdset, efd2obj);
298 if (PyErr_Occurred())
299 ret = NULL;
300 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000301 ret = PyTuple_Pack(3, ifdlist, ofdlist, efdlist);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000302
Barry Warsawc1cb3601996-12-12 22:16:21 +0000303 Py_DECREF(ifdlist);
304 Py_DECREF(ofdlist);
305 Py_DECREF(efdlist);
306 }
307
308 finally:
309 reap_obj(rfd2obj);
310 reap_obj(wfd2obj);
311 reap_obj(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000312#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000313 PyMem_DEL(rfd2obj);
314 PyMem_DEL(wfd2obj);
315 PyMem_DEL(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000316#endif /* SELECT_USES_HEAP */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000317 return ret;
Guido van Rossumed233a51992-06-23 09:07:03 +0000318}
319
Nicholas Bastine62c5c82004-03-21 23:45:42 +0000320#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000321/*
322 * poll() support
323 */
324
325typedef struct {
326 PyObject_HEAD
327 PyObject *dict;
328 int ufd_uptodate;
329 int ufd_len;
330 struct pollfd *ufds;
331} pollObject;
332
Jeremy Hylton938ace62002-07-17 16:30:39 +0000333static PyTypeObject poll_Type;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000334
335/* Update the malloc'ed array of pollfds to match the dictionary
336 contained within a pollObject. Return 1 on success, 0 on an error.
337*/
338
339static int
340update_ufd_array(pollObject *self)
341{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000342 Py_ssize_t i, pos;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000343 PyObject *key, *value;
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000344 struct pollfd *old_ufds = self->ufds;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000345
346 self->ufd_len = PyDict_Size(self->dict);
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000347 PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000348 if (self->ufds == NULL) {
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000349 self->ufds = old_ufds;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000350 PyErr_NoMemory();
351 return 0;
352 }
353
354 i = pos = 0;
Fred Drakedff3a372001-07-19 21:29:49 +0000355 while (PyDict_Next(self->dict, &pos, &key, &value)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000356 self->ufds[i].fd = PyInt_AsLong(key);
Fred Drakedff3a372001-07-19 21:29:49 +0000357 self->ufds[i].events = (short)PyInt_AsLong(value);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000358 i++;
359 }
360 self->ufd_uptodate = 1;
361 return 1;
362}
363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000364PyDoc_STRVAR(poll_register_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000365"register(fd [, eventmask] ) -> None\n\n\
366Register a file descriptor with the polling object.\n\
Barry Warsaw2f704552001-08-16 16:55:10 +0000367fd -- either an integer, or an object with a fileno() method returning an\n\
368 int.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000369events -- an optional bitmask describing the type of events to check for");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000370
371static PyObject *
372poll_register(pollObject *self, PyObject *args)
373{
374 PyObject *o, *key, *value;
375 int fd, events = POLLIN | POLLPRI | POLLOUT;
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000376 int err;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000377
Fred Drake7b87f852001-05-21 03:29:05 +0000378 if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000379 return NULL;
380 }
381
382 fd = PyObject_AsFileDescriptor(o);
383 if (fd == -1) return NULL;
384
385 /* Add entry to the internal dictionary: the key is the
386 file descriptor, and the value is the event mask. */
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000387 key = PyInt_FromLong(fd);
388 if (key == NULL)
389 return NULL;
390 value = PyInt_FromLong(events);
391 if (value == NULL) {
392 Py_DECREF(key);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000393 return NULL;
394 }
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000395 err = PyDict_SetItem(self->dict, key, value);
396 Py_DECREF(key);
397 Py_DECREF(value);
398 if (err < 0)
399 return NULL;
400
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000401 self->ufd_uptodate = 0;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000402
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000403 Py_INCREF(Py_None);
404 return Py_None;
405}
406
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000407PyDoc_STRVAR(poll_modify_doc,
408"modify(fd, eventmask) -> None\n\n\
Andrew M. Kuchlinga8c3f2b2008-03-26 00:16:50 +0000409Modify an already registered file descriptor.\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000410fd -- either an integer, or an object with a fileno() method returning an\n\
411 int.\n\
412events -- an optional bitmask describing the type of events to check for");
413
414static PyObject *
415poll_modify(pollObject *self, PyObject *args)
416{
417 PyObject *o, *key, *value;
418 int fd, events;
419 int err;
420
421 if (!PyArg_ParseTuple(args, "Oi:modify", &o, &events)) {
422 return NULL;
423 }
424
425 fd = PyObject_AsFileDescriptor(o);
426 if (fd == -1) return NULL;
427
428 /* Modify registered fd */
429 key = PyInt_FromLong(fd);
430 if (key == NULL)
431 return NULL;
432 if (PyDict_GetItem(self->dict, key) == NULL) {
433 errno = ENOENT;
434 PyErr_SetFromErrno(PyExc_IOError);
435 return NULL;
436 }
437 value = PyInt_FromLong(events);
438 if (value == NULL) {
439 Py_DECREF(key);
440 return NULL;
441 }
442 err = PyDict_SetItem(self->dict, key, value);
443 Py_DECREF(key);
444 Py_DECREF(value);
445 if (err < 0)
446 return NULL;
447
448 self->ufd_uptodate = 0;
449
450 Py_INCREF(Py_None);
451 return Py_None;
452}
453
454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000455PyDoc_STRVAR(poll_unregister_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000456"unregister(fd) -> None\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000457Remove a file descriptor being tracked by the polling object.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000458
459static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000460poll_unregister(pollObject *self, PyObject *o)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000461{
Georg Brandl96a8c392006-05-29 21:04:52 +0000462 PyObject *key;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000463 int fd;
464
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000465 fd = PyObject_AsFileDescriptor( o );
466 if (fd == -1)
467 return NULL;
468
469 /* Check whether the fd is already in the array */
470 key = PyInt_FromLong(fd);
471 if (key == NULL)
472 return NULL;
473
474 if (PyDict_DelItem(self->dict, key) == -1) {
475 Py_DECREF(key);
476 /* This will simply raise the KeyError set by PyDict_DelItem
477 if the file descriptor isn't registered. */
478 return NULL;
479 }
480
481 Py_DECREF(key);
482 self->ufd_uptodate = 0;
483
484 Py_INCREF(Py_None);
485 return Py_None;
486}
487
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000488PyDoc_STRVAR(poll_poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000489"poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
490Polls the set of registered file descriptors, returning a list containing \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000491any descriptors that have events or errors to report.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000492
493static PyObject *
494poll_poll(pollObject *self, PyObject *args)
495{
496 PyObject *result_list = NULL, *tout = NULL;
497 int timeout = 0, poll_result, i, j;
498 PyObject *value = NULL, *num = NULL;
499
Georg Brandl96a8c392006-05-29 21:04:52 +0000500 if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000501 return NULL;
502 }
503
504 /* Check values for timeout */
505 if (tout == NULL || tout == Py_None)
506 timeout = -1;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000507 else if (!PyNumber_Check(tout)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000508 PyErr_SetString(PyExc_TypeError,
509 "timeout must be an integer or None");
510 return NULL;
511 }
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000512 else {
513 tout = PyNumber_Int(tout);
514 if (!tout)
515 return NULL;
Walter Dörwald08c4cc42002-11-12 11:42:20 +0000516 timeout = PyInt_AsLong(tout);
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000517 Py_DECREF(tout);
Neal Norwitz0f46bbf2005-11-03 05:00:25 +0000518 if (timeout == -1 && PyErr_Occurred())
519 return NULL;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000520 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000521
522 /* Ensure the ufd array is up to date */
523 if (!self->ufd_uptodate)
524 if (update_ufd_array(self) == 0)
525 return NULL;
526
527 /* call poll() */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000528 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000529 poll_result = poll(self->ufds, self->ufd_len, timeout);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000530 Py_END_ALLOW_THREADS
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000531
532 if (poll_result < 0) {
533 PyErr_SetFromErrno(SelectError);
534 return NULL;
535 }
536
537 /* build the result list */
538
539 result_list = PyList_New(poll_result);
540 if (!result_list)
541 return NULL;
542 else {
543 for (i = 0, j = 0; j < poll_result; j++) {
544 /* skip to the next fired descriptor */
545 while (!self->ufds[i].revents) {
546 i++;
547 }
548 /* if we hit a NULL return, set value to NULL
549 and break out of loop; code at end will
550 clean up result_list */
551 value = PyTuple_New(2);
552 if (value == NULL)
553 goto error;
554 num = PyInt_FromLong(self->ufds[i].fd);
555 if (num == NULL) {
556 Py_DECREF(value);
557 goto error;
558 }
559 PyTuple_SET_ITEM(value, 0, num);
560
Andrew M. Kuchlinge5dd1622004-08-07 17:21:27 +0000561 /* The &0xffff is a workaround for AIX. 'revents'
562 is a 16-bit short, and IBM assigned POLLNVAL
563 to be 0x8000, so the conversion to int results
564 in a negative number. See SF bug #923315. */
565 num = PyInt_FromLong(self->ufds[i].revents & 0xffff);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000566 if (num == NULL) {
567 Py_DECREF(value);
568 goto error;
569 }
570 PyTuple_SET_ITEM(value, 1, num);
571 if ((PyList_SetItem(result_list, j, value)) == -1) {
572 Py_DECREF(value);
573 goto error;
574 }
575 i++;
576 }
577 }
578 return result_list;
579
580 error:
581 Py_DECREF(result_list);
582 return NULL;
583}
584
585static PyMethodDef poll_methods[] = {
586 {"register", (PyCFunction)poll_register,
587 METH_VARARGS, poll_register_doc},
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000588 {"modify", (PyCFunction)poll_modify,
589 METH_VARARGS, poll_modify_doc},
590 {"unregister", (PyCFunction)poll_unregister,
Georg Brandl96a8c392006-05-29 21:04:52 +0000591 METH_O, poll_unregister_doc},
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000592 {"poll", (PyCFunction)poll_poll,
593 METH_VARARGS, poll_poll_doc},
594 {NULL, NULL} /* sentinel */
595};
596
597static pollObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000598newPollObject(void)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000599{
600 pollObject *self;
601 self = PyObject_New(pollObject, &poll_Type);
602 if (self == NULL)
603 return NULL;
604 /* ufd_uptodate is a Boolean, denoting whether the
605 array pointed to by ufds matches the contents of the dictionary. */
606 self->ufd_uptodate = 0;
607 self->ufds = NULL;
608 self->dict = PyDict_New();
609 if (self->dict == NULL) {
610 Py_DECREF(self);
611 return NULL;
612 }
613 return self;
614}
615
616static void
617poll_dealloc(pollObject *self)
618{
619 if (self->ufds != NULL)
620 PyMem_DEL(self->ufds);
621 Py_XDECREF(self->dict);
622 PyObject_Del(self);
623}
624
625static PyObject *
626poll_getattr(pollObject *self, char *name)
627{
628 return Py_FindMethod(poll_methods, (PyObject *)self, name);
629}
630
Tim Peters0c322792002-07-17 16:49:03 +0000631static PyTypeObject poll_Type = {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000632 /* The ob_type field must be initialized in the module init function
633 * to be portable to Windows without using C++. */
Martin v. Löwis68192102007-07-21 06:55:02 +0000634 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000635 "select.poll", /*tp_name*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000636 sizeof(pollObject), /*tp_basicsize*/
637 0, /*tp_itemsize*/
638 /* methods */
639 (destructor)poll_dealloc, /*tp_dealloc*/
640 0, /*tp_print*/
641 (getattrfunc)poll_getattr, /*tp_getattr*/
642 0, /*tp_setattr*/
643 0, /*tp_compare*/
644 0, /*tp_repr*/
645 0, /*tp_as_number*/
646 0, /*tp_as_sequence*/
647 0, /*tp_as_mapping*/
648 0, /*tp_hash*/
649};
650
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000651PyDoc_STRVAR(poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000652"Returns a polling object, which supports registering and\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000653unregistering file descriptors, and then polling them for I/O events.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000654
655static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000656select_poll(PyObject *self, PyObject *unused)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000657{
Georg Brandl96a8c392006-05-29 21:04:52 +0000658 return (PyObject *)newPollObject();
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000659}
Ronald Oussoren32fd16e2006-04-23 12:36:23 +0000660
661#ifdef __APPLE__
662/*
663 * On some systems poll() sets errno on invalid file descriptors. We test
664 * for this at runtime because this bug may be fixed or introduced between
665 * OS releases.
666 */
667static int select_have_broken_poll(void)
668{
669 int poll_test;
670 int filedes[2];
671
672 struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 };
673
674 /* Create a file descriptor to make invalid */
675 if (pipe(filedes) < 0) {
676 return 1;
677 }
678 poll_struct.fd = filedes[0];
679 close(filedes[0]);
680 close(filedes[1]);
681 poll_test = poll(&poll_struct, 1, 0);
682 if (poll_test < 0) {
683 return 1;
684 } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) {
685 return 1;
686 }
687 return 0;
688}
689#endif /* __APPLE__ */
690
691#endif /* HAVE_POLL */
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000692
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000693#ifdef HAVE_EPOLL
694/* **************************************************************************
695 * epoll interface for Linux 2.6
696 *
697 * Written by Christian Heimes
698 * Inspired by Twisted's _epoll.pyx and select.poll()
699 */
700
701#ifdef HAVE_SYS_EPOLL_H
702#include <sys/epoll.h>
703#endif
704
705typedef struct {
706 PyObject_HEAD
707 SOCKET epfd; /* epoll control file descriptor */
708} pyEpoll_Object;
709
710static PyTypeObject pyEpoll_Type;
711#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type))
712
713static PyObject *
714pyepoll_err_closed(void)
715{
716 PyErr_SetString(PyExc_ValueError, "I/O operation on closed epoll fd");
717 return NULL;
718}
719
720static int
721pyepoll_internal_close(pyEpoll_Object *self)
722{
723 int save_errno = 0;
724 if (self->epfd >= 0) {
725 int epfd = self->epfd;
726 self->epfd = -1;
727 Py_BEGIN_ALLOW_THREADS
728 if (close(epfd) < 0)
729 save_errno = errno;
730 Py_END_ALLOW_THREADS
731 }
732 return save_errno;
733}
734
735static PyObject *
736newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
737{
738 pyEpoll_Object *self;
739
740 if (sizehint == -1) {
741 sizehint = FD_SETSIZE-1;
742 }
743 else if (sizehint < 1) {
744 PyErr_Format(PyExc_ValueError,
745 "sizehint must be greater zero, got %d",
746 sizehint);
747 return NULL;
748 }
749
750 assert(type != NULL && type->tp_alloc != NULL);
751 self = (pyEpoll_Object *) type->tp_alloc(type, 0);
752 if (self == NULL)
753 return NULL;
754
755 if (fd == -1) {
756 Py_BEGIN_ALLOW_THREADS
757 self->epfd = epoll_create(sizehint);
758 Py_END_ALLOW_THREADS
759 }
760 else {
761 self->epfd = fd;
762 }
763 if (self->epfd < 0) {
764 Py_DECREF(self);
765 PyErr_SetFromErrno(PyExc_IOError);
766 return NULL;
767 }
768 return (PyObject *)self;
769}
770
771
772static PyObject *
773pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
774{
775 int sizehint = -1;
776 static char *kwlist[] = {"sizehint", NULL};
777
778 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist,
779 &sizehint))
780 return NULL;
781
782 return newPyEpoll_Object(type, sizehint, -1);
783}
784
785
786static void
787pyepoll_dealloc(pyEpoll_Object *self)
788{
789 (void)pyepoll_internal_close(self);
790 Py_TYPE(self)->tp_free(self);
791}
792
793static PyObject*
794pyepoll_close(pyEpoll_Object *self)
795{
796 errno = pyepoll_internal_close(self);
797 if (errno < 0) {
798 PyErr_SetFromErrno(PyExc_IOError);
799 return NULL;
800 }
801 Py_RETURN_NONE;
802}
803
804PyDoc_STRVAR(pyepoll_close_doc,
805"close() -> None\n\
806\n\
807Close the epoll control file descriptor. Further operations on the epoll\n\
808object will raise an exception.");
809
810static PyObject*
811pyepoll_get_closed(pyEpoll_Object *self)
812{
813 if (self->epfd < 0)
814 Py_RETURN_TRUE;
815 else
816 Py_RETURN_FALSE;
817}
818
819static PyObject*
820pyepoll_fileno(pyEpoll_Object *self)
821{
822 if (self->epfd < 0)
823 return pyepoll_err_closed();
824 return PyInt_FromLong(self->epfd);
825}
826
827PyDoc_STRVAR(pyepoll_fileno_doc,
828"fileno() -> int\n\
829\n\
830Return the epoll control file descriptor.");
831
832static PyObject*
833pyepoll_fromfd(PyObject *cls, PyObject *args)
834{
835 SOCKET fd;
836
837 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
838 return NULL;
839
840 return newPyEpoll_Object((PyTypeObject*)cls, -1, fd);
841}
842
843PyDoc_STRVAR(pyepoll_fromfd_doc,
844"fromfd(fd) -> epoll\n\
845\n\
846Create an epoll object from a given control fd.");
847
848static PyObject *
849pyepoll_internal_ctl(int epfd, int op, PyObject *pfd, unsigned int events)
850{
851 struct epoll_event ev;
852 int result;
853 int fd;
854
855 if (epfd < 0)
856 return pyepoll_err_closed();
857
858 fd = PyObject_AsFileDescriptor(pfd);
859 if (fd == -1) {
860 return NULL;
861 }
862
863 switch(op) {
864 case EPOLL_CTL_ADD:
865 case EPOLL_CTL_MOD:
866 ev.events = events;
867 ev.data.fd = fd;
868 Py_BEGIN_ALLOW_THREADS
869 result = epoll_ctl(epfd, op, fd, &ev);
870 Py_END_ALLOW_THREADS
871 break;
872 case EPOLL_CTL_DEL:
873 /* In kernel versions before 2.6.9, the EPOLL_CTL_DEL
874 * operation required a non-NULL pointer in event, even
875 * though this argument is ignored. */
876 Py_BEGIN_ALLOW_THREADS
877 result = epoll_ctl(epfd, op, fd, &ev);
878 if (errno == EBADF) {
879 /* fd already closed */
880 result = 0;
881 errno = 0;
882 }
883 Py_END_ALLOW_THREADS
884 break;
885 default:
886 result = -1;
887 errno = EINVAL;
888 }
889
890 if (result < 0) {
891 PyErr_SetFromErrno(PyExc_IOError);
892 return NULL;
893 }
894 Py_RETURN_NONE;
895}
896
897static PyObject *
898pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
899{
900 PyObject *pfd;
901 unsigned int events = EPOLLIN | EPOLLOUT | EPOLLPRI;
902 static char *kwlist[] = {"fd", "eventmask", NULL};
903
904 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|I:register", kwlist,
905 &pfd, &events)) {
906 return NULL;
907 }
908
909 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_ADD, pfd, events);
910}
911
912PyDoc_STRVAR(pyepoll_register_doc,
913"register(fd[, eventmask]) -> bool\n\
914\n\
Andrew M. Kuchlinga8c3f2b2008-03-26 00:16:50 +0000915Registers a new fd or modifies an already registered fd. register() returns\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000916True if a new fd was registered or False if the event mask for fd was modified.\n\
Andrew M. Kuchlinga8c3f2b2008-03-26 00:16:50 +0000917fd is the target file descriptor of the operation.\n\
918events is a bit set composed of the various EPOLL constants; the default\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000919is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
920\n\
921The epoll interface supports all file descriptors that support poll.");
922
923static PyObject *
924pyepoll_modify(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
925{
926 PyObject *pfd;
927 unsigned int events;
928 static char *kwlist[] = {"fd", "eventmask", NULL};
929
930 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OI:modify", kwlist,
931 &pfd, &events)) {
932 return NULL;
933 }
934
935 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_MOD, pfd, events);
936}
937
938PyDoc_STRVAR(pyepoll_modify_doc,
939"modify(fd, eventmask) -> None\n\
940\n\
941fd is the target file descriptor of the operation\n\
942events is a bit set composed of the various EPOLL constants");
943
944static PyObject *
945pyepoll_unregister(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
946{
947 PyObject *pfd;
948 static char *kwlist[] = {"fd", NULL};
949
950 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:unregister", kwlist,
951 &pfd)) {
952 return NULL;
953 }
954
955 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_DEL, pfd, 0);
956}
957
958PyDoc_STRVAR(pyepoll_unregister_doc,
959"unregister(fd) -> None\n\
960\n\
961fd is the target file descriptor of the operation.");
962
963static PyObject *
964pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
965{
966 double dtimeout = -1.;
967 int timeout;
968 int maxevents = -1;
969 int nfds, i;
970 PyObject *elist = NULL, *etuple = NULL;
971 struct epoll_event *evs = NULL;
972 static char *kwlist[] = {"timeout", "maxevents", NULL};
973
974 if (self->epfd < 0)
975 return pyepoll_err_closed();
976
977 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|di:poll", kwlist,
978 &dtimeout, &maxevents)) {
979 return NULL;
980 }
981
982 if (dtimeout < 0) {
983 timeout = -1;
984 }
985 else if (dtimeout * 1000.0 > INT_MAX) {
986 PyErr_SetString(PyExc_OverflowError,
987 "timeout is too large");
Georg Brandl018a3622008-03-26 12:57:47 +0000988 return NULL;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +0000989 }
990 else {
991 timeout = (int)(dtimeout * 1000.0);
992 }
993
994 if (maxevents == -1) {
995 maxevents = FD_SETSIZE-1;
996 }
997 else if (maxevents < 1) {
998 PyErr_Format(PyExc_ValueError,
999 "maxevents must be greater than 0, got %d",
1000 maxevents);
1001 return NULL;
1002 }
1003
1004 evs = PyMem_New(struct epoll_event, maxevents);
1005 if (evs == NULL) {
1006 Py_DECREF(self);
1007 PyErr_NoMemory();
1008 return NULL;
1009 }
1010
1011 Py_BEGIN_ALLOW_THREADS
1012 nfds = epoll_wait(self->epfd, evs, maxevents, timeout);
1013 Py_END_ALLOW_THREADS
1014 if (nfds < 0) {
1015 PyErr_SetFromErrno(PyExc_IOError);
1016 goto error;
1017 }
1018
1019 elist = PyList_New(nfds);
1020 if (elist == NULL) {
1021 goto error;
1022 }
1023
1024 for (i = 0; i < nfds; i++) {
Georg Brandl018a3622008-03-26 12:57:47 +00001025 etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001026 if (etuple == NULL) {
Georg Brandl018a3622008-03-26 12:57:47 +00001027 Py_CLEAR(elist);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001028 goto error;
1029 }
1030 PyList_SET_ITEM(elist, i, etuple);
1031 }
1032
Georg Brandl018a3622008-03-26 12:57:47 +00001033 error:
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001034 PyMem_Free(evs);
1035 return elist;
1036}
1037
1038PyDoc_STRVAR(pyepoll_poll_doc,
1039"poll([timeout=-1[, maxevents=-1]]) -> [(fd, events), (...)]\n\
1040\n\
1041Wait for events on the epoll file descriptor for a maximum time of timeout\n\
1042in seconds (as float). -1 makes poll wait indefinitely.\n\
1043Up to maxevents are returned to the caller.");
1044
1045static PyMethodDef pyepoll_methods[] = {
1046 {"fromfd", (PyCFunction)pyepoll_fromfd,
1047 METH_VARARGS | METH_CLASS, pyepoll_fromfd_doc},
1048 {"close", (PyCFunction)pyepoll_close, METH_NOARGS,
1049 pyepoll_close_doc},
1050 {"fileno", (PyCFunction)pyepoll_fileno, METH_NOARGS,
1051 pyepoll_fileno_doc},
1052 {"modify", (PyCFunction)pyepoll_modify,
1053 METH_VARARGS | METH_KEYWORDS, pyepoll_modify_doc},
1054 {"register", (PyCFunction)pyepoll_register,
1055 METH_VARARGS | METH_KEYWORDS, pyepoll_register_doc},
1056 {"unregister", (PyCFunction)pyepoll_unregister,
1057 METH_VARARGS | METH_KEYWORDS, pyepoll_unregister_doc},
1058 {"poll", (PyCFunction)pyepoll_poll,
1059 METH_VARARGS | METH_KEYWORDS, pyepoll_poll_doc},
1060 {NULL, NULL},
1061};
1062
1063static PyGetSetDef pyepoll_getsetlist[] = {
1064 {"closed", (getter)pyepoll_get_closed, NULL,
1065 "True if the epoll handler is closed"},
1066 {0},
1067};
1068
1069PyDoc_STRVAR(pyepoll_doc,
1070"select.epoll([sizehint=-1])\n\
1071\n\
1072Returns an epolling object\n\
1073\n\
1074sizehint must be a positive integer or -1 for the default size. The\n\
1075sizehint is used to optimize internal data structures. It doesn't limit\n\
1076the maximum number of monitored events.");
1077
1078static PyTypeObject pyEpoll_Type = {
1079 PyVarObject_HEAD_INIT(NULL, 0)
1080 "select.epoll", /* tp_name */
1081 sizeof(pyEpoll_Object), /* tp_basicsize */
1082 0, /* tp_itemsize */
1083 (destructor)pyepoll_dealloc, /* tp_dealloc */
1084 0, /* tp_print */
1085 0, /* tp_getattr */
1086 0, /* tp_setattr */
1087 0, /* tp_compare */
1088 0, /* tp_repr */
1089 0, /* tp_as_number */
1090 0, /* tp_as_sequence */
1091 0, /* tp_as_mapping */
1092 0, /* tp_hash */
1093 0, /* tp_call */
1094 0, /* tp_str */
1095 PyObject_GenericGetAttr, /* tp_getattro */
1096 0, /* tp_setattro */
1097 0, /* tp_as_buffer */
1098 Py_TPFLAGS_DEFAULT, /* tp_flags */
1099 pyepoll_doc, /* tp_doc */
1100 0, /* tp_traverse */
1101 0, /* tp_clear */
1102 0, /* tp_richcompare */
1103 0, /* tp_weaklistoffset */
1104 0, /* tp_iter */
1105 0, /* tp_iternext */
1106 pyepoll_methods, /* tp_methods */
1107 0, /* tp_members */
1108 pyepoll_getsetlist, /* tp_getset */
1109 0, /* tp_base */
1110 0, /* tp_dict */
1111 0, /* tp_descr_get */
1112 0, /* tp_descr_set */
1113 0, /* tp_dictoffset */
1114 0, /* tp_init */
1115 0, /* tp_alloc */
1116 pyepoll_new, /* tp_new */
1117 0, /* tp_free */
1118};
1119
1120#endif /* HAVE_EPOLL */
1121
1122#ifdef HAVE_KQUEUE
1123/* **************************************************************************
1124 * kqueue interface for BSD
1125 *
1126 * Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
1127 * All rights reserved.
1128 *
1129 * Redistribution and use in source and binary forms, with or without
1130 * modification, are permitted provided that the following conditions
1131 * are met:
1132 * 1. Redistributions of source code must retain the above copyright
1133 * notice, this list of conditions and the following disclaimer.
1134 * 2. Redistributions in binary form must reproduce the above copyright
1135 * notice, this list of conditions and the following disclaimer in the
1136 * documentation and/or other materials provided with the distribution.
1137 *
1138 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1139 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1140 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1141 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1142 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1143 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1144 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1145 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1146 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1147 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1148 * SUCH DAMAGE.
1149 */
1150
1151#ifdef HAVE_SYS_EVENT_H
1152#include <sys/event.h>
1153#endif
1154
1155PyDoc_STRVAR(kqueue_event_doc,
Georg Brandlb6453a92010-03-21 19:16:28 +00001156"kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001157\n\
1158This object is the equivalent of the struct kevent for the C API.\n\
1159\n\
1160See the kqueue manpage for more detailed information about the meaning\n\
1161of the arguments.\n\
1162\n\
1163One minor note: while you might hope that udata could store a\n\
1164reference to a python object, it cannot, because it is impossible to\n\
1165keep a proper reference count of the object once it's passed into the\n\
1166kernel. Therefore, I have restricted it to only storing an integer. I\n\
1167recommend ignoring it and simply using the 'ident' field to key off\n\
1168of. You could also set up a dictionary on the python side to store a\n\
1169udata->object mapping.");
1170
1171typedef struct {
1172 PyObject_HEAD
1173 struct kevent e;
1174} kqueue_event_Object;
1175
1176static PyTypeObject kqueue_event_Type;
1177
1178#define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type))
1179
1180typedef struct {
1181 PyObject_HEAD
1182 SOCKET kqfd; /* kqueue control fd */
1183} kqueue_queue_Object;
1184
1185static PyTypeObject kqueue_queue_Type;
1186
1187#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type))
1188
1189/* Unfortunately, we can't store python objects in udata, because
1190 * kevents in the kernel can be removed without warning, which would
1191 * forever lose the refcount on the object stored with it.
1192 */
1193
1194#define KQ_OFF(x) offsetof(kqueue_event_Object, x)
1195static struct PyMemberDef kqueue_event_members[] = {
1196 {"ident", T_UINT, KQ_OFF(e.ident)},
1197 {"filter", T_SHORT, KQ_OFF(e.filter)},
1198 {"flags", T_USHORT, KQ_OFF(e.flags)},
1199 {"fflags", T_UINT, KQ_OFF(e.fflags)},
1200 {"data", T_INT, KQ_OFF(e.data)},
1201 {"udata", T_INT, KQ_OFF(e.udata)},
1202 {NULL} /* Sentinel */
1203};
1204#undef KQ_OFF
1205
1206static PyObject *
Georg Brandl5a7eca12010-03-21 19:29:04 +00001207
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001208kqueue_event_repr(kqueue_event_Object *s)
1209{
1210 char buf[1024];
1211 PyOS_snprintf(
1212 buf, sizeof(buf),
1213 "<select.kevent ident=%lu filter=%d flags=0x%x fflags=0x%x "
1214 "data=0x%lx udata=%p>",
1215 (unsigned long)(s->e.ident), s->e.filter, s->e.flags,
1216 s->e.fflags, (long)(s->e.data), s->e.udata);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001217 return PyString_FromString(buf);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001218}
1219
1220static int
1221kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds)
1222{
1223 PyObject *pfd;
1224 static char *kwlist[] = {"ident", "filter", "flags", "fflags",
1225 "data", "udata", NULL};
1226
1227 EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
1228
1229 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|hhiii:kevent", kwlist,
1230 &pfd, &(self->e.filter), &(self->e.flags),
1231 &(self->e.fflags), &(self->e.data), &(self->e.udata))) {
1232 return -1;
1233 }
1234
1235 self->e.ident = PyObject_AsFileDescriptor(pfd);
1236 if (self->e.ident == -1) {
1237 return -1;
1238 }
1239 return 0;
1240}
1241
1242static PyObject *
1243kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
1244 int op)
1245{
1246 int result = 0;
1247
1248 if (!kqueue_event_Check(o)) {
1249 if (op == Py_EQ || op == Py_NE) {
1250 PyObject *res = op == Py_EQ ? Py_False : Py_True;
1251 Py_INCREF(res);
1252 return res;
1253 }
1254 PyErr_Format(PyExc_TypeError,
1255 "can't compare %.200s to %.200s",
1256 Py_TYPE(s)->tp_name, Py_TYPE(o)->tp_name);
1257 return NULL;
1258 }
1259 if (((result = s->e.ident - o->e.ident) == 0) &&
1260 ((result = s->e.filter - o->e.filter) == 0) &&
1261 ((result = s->e.flags - o->e.flags) == 0) &&
1262 ((result = s->e.fflags - o->e.fflags) == 0) &&
1263 ((result = s->e.data - o->e.data) == 0) &&
1264 ((result = s->e.udata - o->e.udata) == 0)
1265 ) {
1266 result = 0;
1267 }
1268
1269 switch (op) {
1270 case Py_EQ:
1271 result = (result == 0);
1272 break;
1273 case Py_NE:
1274 result = (result != 0);
1275 break;
1276 case Py_LE:
1277 result = (result <= 0);
1278 break;
1279 case Py_GE:
1280 result = (result >= 0);
1281 break;
1282 case Py_LT:
1283 result = (result < 0);
1284 break;
1285 case Py_GT:
1286 result = (result > 0);
1287 break;
1288 }
1289 return PyBool_FromLong(result);
1290}
1291
1292static PyTypeObject kqueue_event_Type = {
1293 PyVarObject_HEAD_INIT(NULL, 0)
1294 "select.kevent", /* tp_name */
1295 sizeof(kqueue_event_Object), /* tp_basicsize */
1296 0, /* tp_itemsize */
1297 0, /* tp_dealloc */
1298 0, /* tp_print */
1299 0, /* tp_getattr */
1300 0, /* tp_setattr */
1301 0, /* tp_compare */
1302 (reprfunc)kqueue_event_repr, /* tp_repr */
1303 0, /* tp_as_number */
1304 0, /* tp_as_sequence */
1305 0, /* tp_as_mapping */
1306 0, /* tp_hash */
1307 0, /* tp_call */
1308 0, /* tp_str */
1309 0, /* tp_getattro */
1310 0, /* tp_setattro */
1311 0, /* tp_as_buffer */
1312 Py_TPFLAGS_DEFAULT, /* tp_flags */
1313 kqueue_event_doc, /* tp_doc */
1314 0, /* tp_traverse */
1315 0, /* tp_clear */
1316 (richcmpfunc)kqueue_event_richcompare, /* tp_richcompare */
1317 0, /* tp_weaklistoffset */
1318 0, /* tp_iter */
1319 0, /* tp_iternext */
1320 0, /* tp_methods */
1321 kqueue_event_members, /* tp_members */
1322 0, /* tp_getset */
1323 0, /* tp_base */
1324 0, /* tp_dict */
1325 0, /* tp_descr_get */
1326 0, /* tp_descr_set */
1327 0, /* tp_dictoffset */
1328 (initproc)kqueue_event_init, /* tp_init */
1329 0, /* tp_alloc */
1330 0, /* tp_new */
1331 0, /* tp_free */
1332};
1333
1334static PyObject *
1335kqueue_queue_err_closed(void)
1336{
1337 PyErr_SetString(PyExc_ValueError, "I/O operation on closed kqueue fd");
1338 return NULL;
1339}
1340
1341static int
1342kqueue_queue_internal_close(kqueue_queue_Object *self)
1343{
1344 int save_errno = 0;
1345 if (self->kqfd >= 0) {
1346 int kqfd = self->kqfd;
1347 self->kqfd = -1;
1348 Py_BEGIN_ALLOW_THREADS
1349 if (close(kqfd) < 0)
1350 save_errno = errno;
1351 Py_END_ALLOW_THREADS
1352 }
1353 return save_errno;
1354}
1355
1356static PyObject *
1357newKqueue_Object(PyTypeObject *type, SOCKET fd)
1358{
1359 kqueue_queue_Object *self;
1360 assert(type != NULL && type->tp_alloc != NULL);
1361 self = (kqueue_queue_Object *) type->tp_alloc(type, 0);
1362 if (self == NULL) {
1363 return NULL;
1364 }
1365
1366 if (fd == -1) {
1367 Py_BEGIN_ALLOW_THREADS
1368 self->kqfd = kqueue();
1369 Py_END_ALLOW_THREADS
1370 }
1371 else {
1372 self->kqfd = fd;
1373 }
1374 if (self->kqfd < 0) {
1375 Py_DECREF(self);
1376 PyErr_SetFromErrno(PyExc_IOError);
1377 return NULL;
1378 }
1379 return (PyObject *)self;
1380}
1381
1382static PyObject *
1383kqueue_queue_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1384{
1385
1386 if ((args != NULL && PyObject_Size(args)) ||
1387 (kwds != NULL && PyObject_Size(kwds))) {
1388 PyErr_SetString(PyExc_ValueError,
1389 "select.kqueue doesn't accept arguments");
1390 return NULL;
1391 }
1392
1393 return newKqueue_Object(type, -1);
1394}
1395
1396static void
1397kqueue_queue_dealloc(kqueue_queue_Object *self)
1398{
1399 kqueue_queue_internal_close(self);
1400 Py_TYPE(self)->tp_free(self);
1401}
1402
1403static PyObject*
1404kqueue_queue_close(kqueue_queue_Object *self)
1405{
1406 errno = kqueue_queue_internal_close(self);
1407 if (errno < 0) {
1408 PyErr_SetFromErrno(PyExc_IOError);
1409 return NULL;
1410 }
1411 Py_RETURN_NONE;
1412}
1413
1414PyDoc_STRVAR(kqueue_queue_close_doc,
1415"close() -> None\n\
1416\n\
1417Close the kqueue control file descriptor. Further operations on the kqueue\n\
1418object will raise an exception.");
1419
1420static PyObject*
1421kqueue_queue_get_closed(kqueue_queue_Object *self)
1422{
1423 if (self->kqfd < 0)
1424 Py_RETURN_TRUE;
1425 else
1426 Py_RETURN_FALSE;
1427}
1428
1429static PyObject*
1430kqueue_queue_fileno(kqueue_queue_Object *self)
1431{
1432 if (self->kqfd < 0)
1433 return kqueue_queue_err_closed();
1434 return PyInt_FromLong(self->kqfd);
1435}
1436
1437PyDoc_STRVAR(kqueue_queue_fileno_doc,
1438"fileno() -> int\n\
1439\n\
1440Return the kqueue control file descriptor.");
1441
1442static PyObject*
1443kqueue_queue_fromfd(PyObject *cls, PyObject *args)
1444{
1445 SOCKET fd;
1446
1447 if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
1448 return NULL;
1449
1450 return newKqueue_Object((PyTypeObject*)cls, fd);
1451}
1452
1453PyDoc_STRVAR(kqueue_queue_fromfd_doc,
1454"fromfd(fd) -> kqueue\n\
1455\n\
1456Create a kqueue object from a given control fd.");
1457
1458static PyObject *
1459kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
1460{
1461 int nevents = 0;
1462 int gotevents = 0;
1463 int nchanges = 0;
1464 int i = 0;
1465 PyObject *otimeout = NULL;
1466 PyObject *ch = NULL;
1467 PyObject *it = NULL, *ei = NULL;
1468 PyObject *result = NULL;
1469 struct kevent *evl = NULL;
1470 struct kevent *chl = NULL;
1471 struct timespec timeoutspec;
1472 struct timespec *ptimeoutspec;
1473
1474 if (self->kqfd < 0)
1475 return kqueue_queue_err_closed();
1476
1477 if (!PyArg_ParseTuple(args, "Oi|O:control", &ch, &nevents, &otimeout))
1478 return NULL;
1479
1480 if (nevents < 0) {
1481 PyErr_Format(PyExc_ValueError,
1482 "Length of eventlist must be 0 or positive, got %d",
Georg Brandlf004d9d2009-10-27 15:39:53 +00001483 nevents);
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001484 return NULL;
1485 }
1486
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001487 if (otimeout == Py_None || otimeout == NULL) {
1488 ptimeoutspec = NULL;
1489 }
1490 else if (PyNumber_Check(otimeout)) {
1491 double timeout;
1492 long seconds;
1493
1494 timeout = PyFloat_AsDouble(otimeout);
1495 if (timeout == -1 && PyErr_Occurred())
1496 return NULL;
1497 if (timeout > (double)LONG_MAX) {
1498 PyErr_SetString(PyExc_OverflowError,
1499 "timeout period too long");
1500 return NULL;
1501 }
1502 if (timeout < 0) {
1503 PyErr_SetString(PyExc_ValueError,
1504 "timeout must be positive or None");
1505 return NULL;
1506 }
1507
1508 seconds = (long)timeout;
1509 timeout = timeout - (double)seconds;
1510 timeoutspec.tv_sec = seconds;
1511 timeoutspec.tv_nsec = (long)(timeout * 1E9);
1512 ptimeoutspec = &timeoutspec;
1513 }
1514 else {
1515 PyErr_Format(PyExc_TypeError,
1516 "timeout argument must be an number "
1517 "or None, got %.200s",
1518 Py_TYPE(otimeout)->tp_name);
1519 return NULL;
1520 }
1521
Georg Brandl5a7eca12010-03-21 19:29:04 +00001522 if (ch != NULL && ch != Py_None) {
1523 it = PyObject_GetIter(ch);
1524 if (it == NULL) {
1525 PyErr_SetString(PyExc_TypeError,
1526 "changelist is not iterable");
1527 return NULL;
1528 }
1529 nchanges = PyObject_Size(ch);
1530 if (nchanges < 0) {
1531 goto error;
1532 }
1533
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001534 chl = PyMem_New(struct kevent, nchanges);
1535 if (chl == NULL) {
1536 PyErr_NoMemory();
Georg Brandl5a7eca12010-03-21 19:29:04 +00001537 goto error;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001538 }
Georg Brandlf004d9d2009-10-27 15:39:53 +00001539 i = 0;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001540 while ((ei = PyIter_Next(it)) != NULL) {
1541 if (!kqueue_event_Check(ei)) {
1542 Py_DECREF(ei);
1543 PyErr_SetString(PyExc_TypeError,
1544 "changelist must be an iterable of "
1545 "select.kevent objects");
1546 goto error;
1547 } else {
Georg Brandlf004d9d2009-10-27 15:39:53 +00001548 chl[i++] = ((kqueue_event_Object *)ei)->e;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001549 }
1550 Py_DECREF(ei);
1551 }
1552 }
1553 Py_CLEAR(it);
1554
1555 /* event list */
1556 if (nevents) {
1557 evl = PyMem_New(struct kevent, nevents);
1558 if (evl == NULL) {
1559 PyErr_NoMemory();
Georg Brandl5a7eca12010-03-21 19:29:04 +00001560 goto error;
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001561 }
1562 }
1563
1564 Py_BEGIN_ALLOW_THREADS
1565 gotevents = kevent(self->kqfd, chl, nchanges,
1566 evl, nevents, ptimeoutspec);
1567 Py_END_ALLOW_THREADS
1568
1569 if (gotevents == -1) {
1570 PyErr_SetFromErrno(PyExc_OSError);
1571 goto error;
1572 }
1573
1574 result = PyList_New(gotevents);
1575 if (result == NULL) {
1576 goto error;
1577 }
1578
Georg Brandlf004d9d2009-10-27 15:39:53 +00001579 for (i = 0; i < gotevents; i++) {
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001580 kqueue_event_Object *ch;
1581
1582 ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type);
1583 if (ch == NULL) {
1584 goto error;
1585 }
1586 ch->e = evl[i];
1587 PyList_SET_ITEM(result, i, (PyObject *)ch);
1588 }
1589 PyMem_Free(chl);
1590 PyMem_Free(evl);
1591 return result;
1592
1593 error:
1594 PyMem_Free(chl);
1595 PyMem_Free(evl);
1596 Py_XDECREF(result);
1597 Py_XDECREF(it);
1598 return NULL;
1599}
1600
1601PyDoc_STRVAR(kqueue_queue_control_doc,
Georg Brandl2f3bd832008-09-21 07:14:44 +00001602"control(changelist, max_events[, timeout=None]) -> eventlist\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001603\n\
1604Calls the kernel kevent function.\n\
1605- changelist must be a list of kevent objects describing the changes\n\
1606 to be made to the kernel's watch list or None.\n\
1607- max_events lets you specify the maximum number of events that the\n\
1608 kernel will return.\n\
1609- timeout is the maximum time to wait in seconds, or else None,\n\
1610 to wait forever. timeout accepts floats for smaller timeouts, too.");
1611
1612
1613static PyMethodDef kqueue_queue_methods[] = {
1614 {"fromfd", (PyCFunction)kqueue_queue_fromfd,
1615 METH_VARARGS | METH_CLASS, kqueue_queue_fromfd_doc},
1616 {"close", (PyCFunction)kqueue_queue_close, METH_NOARGS,
1617 kqueue_queue_close_doc},
1618 {"fileno", (PyCFunction)kqueue_queue_fileno, METH_NOARGS,
1619 kqueue_queue_fileno_doc},
1620 {"control", (PyCFunction)kqueue_queue_control,
1621 METH_VARARGS , kqueue_queue_control_doc},
1622 {NULL, NULL},
1623};
1624
1625static PyGetSetDef kqueue_queue_getsetlist[] = {
1626 {"closed", (getter)kqueue_queue_get_closed, NULL,
1627 "True if the kqueue handler is closed"},
1628 {0},
1629};
1630
1631PyDoc_STRVAR(kqueue_queue_doc,
1632"Kqueue syscall wrapper.\n\
1633\n\
1634For example, to start watching a socket for input:\n\
1635>>> kq = kqueue()\n\
1636>>> sock = socket()\n\
1637>>> sock.connect((host, port))\n\
1638>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_ADD)], 0)\n\
1639\n\
1640To wait one second for it to become writeable:\n\
1641>>> kq.control(None, 1, 1000)\n\
1642\n\
1643To stop listening:\n\
1644>>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_DELETE)], 0)");
1645
1646static PyTypeObject kqueue_queue_Type = {
1647 PyVarObject_HEAD_INIT(NULL, 0)
1648 "select.kqueue", /* tp_name */
1649 sizeof(kqueue_queue_Object), /* tp_basicsize */
1650 0, /* tp_itemsize */
1651 (destructor)kqueue_queue_dealloc, /* tp_dealloc */
1652 0, /* tp_print */
1653 0, /* tp_getattr */
1654 0, /* tp_setattr */
1655 0, /* tp_compare */
1656 0, /* tp_repr */
1657 0, /* tp_as_number */
1658 0, /* tp_as_sequence */
1659 0, /* tp_as_mapping */
1660 0, /* tp_hash */
1661 0, /* tp_call */
1662 0, /* tp_str */
1663 0, /* tp_getattro */
1664 0, /* tp_setattro */
1665 0, /* tp_as_buffer */
1666 Py_TPFLAGS_DEFAULT, /* tp_flags */
1667 kqueue_queue_doc, /* tp_doc */
1668 0, /* tp_traverse */
1669 0, /* tp_clear */
1670 0, /* tp_richcompare */
1671 0, /* tp_weaklistoffset */
1672 0, /* tp_iter */
1673 0, /* tp_iternext */
1674 kqueue_queue_methods, /* tp_methods */
1675 0, /* tp_members */
1676 kqueue_queue_getsetlist, /* tp_getset */
1677 0, /* tp_base */
1678 0, /* tp_dict */
1679 0, /* tp_descr_get */
1680 0, /* tp_descr_set */
1681 0, /* tp_dictoffset */
1682 0, /* tp_init */
1683 0, /* tp_alloc */
1684 kqueue_queue_new, /* tp_new */
1685 0, /* tp_free */
1686};
1687
1688#endif /* HAVE_KQUEUE */
1689/* ************************************************************************ */
1690
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001691PyDoc_STRVAR(select_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001692"select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
1693\n\
1694Wait until one or more file descriptors are ready for some kind of I/O.\n\
Brett Cannon62dba4c2003-09-10 19:37:42 +00001695The first three arguments are sequences of file descriptors to be waited for:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001696rlist -- wait until ready for reading\n\
1697wlist -- wait until ready for writing\n\
1698xlist -- wait for an ``exceptional condition''\n\
1699If only one kind of condition is required, pass [] for the other lists.\n\
1700A file descriptor is either a socket or file object, or a small integer\n\
1701gotten from a fileno() method call on one of those.\n\
1702\n\
1703The optional 4th argument specifies a timeout in seconds; it may be\n\
1704a floating point number to specify fractions of seconds. If it is absent\n\
1705or None, the call will never time out.\n\
1706\n\
1707The return value is a tuple of three lists corresponding to the first three\n\
1708arguments; each contains the subset of the corresponding file descriptors\n\
1709that are ready.\n\
1710\n\
1711*** IMPORTANT NOTICE ***\n\
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001712On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\
Andrew M. Kuchlinga8c3f2b2008-03-26 00:16:50 +00001713descriptors can be used.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001714
Barry Warsawe4ac0aa1996-12-12 00:04:35 +00001715static PyMethodDef select_methods[] = {
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001716 {"select", select_select, METH_VARARGS, select_doc},
1717#ifdef HAVE_POLL
1718 {"poll", select_poll, METH_NOARGS, poll_doc},
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001719#endif /* HAVE_POLL */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001720 {0, 0}, /* sentinel */
Guido van Rossumed233a51992-06-23 09:07:03 +00001721};
1722
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001723PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001724"This module supports asynchronous I/O on multiple file descriptors.\n\
1725\n\
1726*** IMPORTANT NOTICE ***\n\
Neal Norwitz2a30cd02006-07-10 01:18:57 +00001727On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.");
Guido van Rossumed233a51992-06-23 09:07:03 +00001728
Mark Hammond62b1ab12002-07-23 06:31:15 +00001729PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001730initselect(void)
Guido van Rossumed233a51992-06-23 09:07:03 +00001731{
Fred Drake4baedc12002-04-01 14:53:37 +00001732 PyObject *m;
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001733 m = Py_InitModule3("select", select_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001734 if (m == NULL)
1735 return;
Fred Drake4baedc12002-04-01 14:53:37 +00001736
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001737 SelectError = PyErr_NewException("select.error", NULL, NULL);
Fred Drake4baedc12002-04-01 14:53:37 +00001738 Py_INCREF(SelectError);
1739 PyModule_AddObject(m, "error", SelectError);
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001740
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001741#if defined(HAVE_POLL)
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001742#ifdef __APPLE__
1743 if (select_have_broken_poll()) {
1744 if (PyObject_DelAttrString(m, "poll") == -1) {
1745 PyErr_Clear();
1746 }
1747 } else {
1748#else
1749 {
1750#endif
Christian Heimese93237d2007-12-19 02:37:44 +00001751 Py_TYPE(&poll_Type) = &PyType_Type;
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001752 PyModule_AddIntConstant(m, "POLLIN", POLLIN);
1753 PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
1754 PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
1755 PyModule_AddIntConstant(m, "POLLERR", POLLERR);
1756 PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
1757 PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +00001758
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001759#ifdef POLLRDNORM
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001760 PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001761#endif
1762#ifdef POLLRDBAND
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001763 PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001764#endif
1765#ifdef POLLWRNORM
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001766 PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001767#endif
1768#ifdef POLLWRBAND
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001769 PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +00001770#endif
Sjoerd Mullender239f8362000-08-25 13:59:18 +00001771#ifdef POLLMSG
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001772 PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
Sjoerd Mullender239f8362000-08-25 13:59:18 +00001773#endif
Ronald Oussoren32fd16e2006-04-23 12:36:23 +00001774 }
1775#endif /* HAVE_POLL */
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001776
1777#ifdef HAVE_EPOLL
1778 Py_TYPE(&pyEpoll_Type) = &PyType_Type;
1779 if (PyType_Ready(&pyEpoll_Type) < 0)
1780 return;
1781
1782 Py_INCREF(&pyEpoll_Type);
1783 PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type);
1784
1785 PyModule_AddIntConstant(m, "EPOLLIN", EPOLLIN);
1786 PyModule_AddIntConstant(m, "EPOLLOUT", EPOLLOUT);
1787 PyModule_AddIntConstant(m, "EPOLLPRI", EPOLLPRI);
1788 PyModule_AddIntConstant(m, "EPOLLERR", EPOLLERR);
1789 PyModule_AddIntConstant(m, "EPOLLHUP", EPOLLHUP);
1790 PyModule_AddIntConstant(m, "EPOLLET", EPOLLET);
1791#ifdef EPOLLONESHOT
1792 /* Kernel 2.6.2+ */
1793 PyModule_AddIntConstant(m, "EPOLLONESHOT", EPOLLONESHOT);
1794#endif
1795 /* PyModule_AddIntConstant(m, "EPOLL_RDHUP", EPOLLRDHUP); */
1796 PyModule_AddIntConstant(m, "EPOLLRDNORM", EPOLLRDNORM);
1797 PyModule_AddIntConstant(m, "EPOLLRDBAND", EPOLLRDBAND);
1798 PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
1799 PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
1800 PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
1801#endif /* HAVE_EPOLL */
1802
1803#ifdef HAVE_KQUEUE
1804 kqueue_event_Type.tp_new = PyType_GenericNew;
1805 Py_TYPE(&kqueue_event_Type) = &PyType_Type;
1806 if(PyType_Ready(&kqueue_event_Type) < 0)
1807 return;
1808
1809 Py_INCREF(&kqueue_event_Type);
1810 PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type);
1811
1812 Py_TYPE(&kqueue_queue_Type) = &PyType_Type;
1813 if(PyType_Ready(&kqueue_queue_Type) < 0)
1814 return;
1815 Py_INCREF(&kqueue_queue_Type);
1816 PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type);
1817
1818 /* event filters */
1819 PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
1820 PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE);
1821 PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO);
1822 PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE);
1823 PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC);
1824#ifdef EVFILT_NETDEV
1825 PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV);
1826#endif
1827 PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
1828 PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER);
1829
1830 /* event flags */
1831 PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD);
1832 PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE);
1833 PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE);
1834 PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE);
1835 PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT);
1836 PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR);
1837
1838 PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS);
1839 PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1);
1840
1841 PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF);
1842 PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR);
1843
1844 /* READ WRITE filter flag */
1845 PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT);
1846
1847 /* VNODE filter flags */
1848 PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE);
1849 PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE);
1850 PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND);
1851 PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB);
1852 PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK);
1853 PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME);
1854 PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE);
1855
1856 /* PROC filter flags */
1857 PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT);
1858 PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK);
1859 PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC);
1860 PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
1861 PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
1862
1863 PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK);
1864 PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD);
1865 PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR);
1866
1867 /* NETDEV filter flags */
1868#ifdef EVFILT_NETDEV
1869 PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP);
1870 PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
1871 PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV);
1872#endif
1873
1874#endif /* HAVE_KQUEUE */
Guido van Rossumed233a51992-06-23 09:07:03 +00001875}