blob: 98b75f0672bfabc18312b6325978edaa326fe78c [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"
Guido van Rossumed233a51992-06-23 09:07:03 +000010
Tim Petersd92dfe02000-12-12 01:18:41 +000011/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
12 64 is too small (too many people have bumped into that limit).
13 Here we boost it.
14 Users who want even more than the boosted limit should #define
15 FD_SETSIZE higher before this; e.g., via compiler /D switch.
16*/
17#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
18#define FD_SETSIZE 512
19#endif
20
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000021#if defined(HAVE_POLL_H)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000022#include <poll.h>
Andrew M. Kuchling737fbb32001-07-14 20:54:37 +000023#elif defined(HAVE_SYS_POLL_H)
24#include <sys/poll.h>
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +000025#endif
Guido van Rossuma376cc51996-12-05 23:43:35 +000026
Guido van Rossum37273171996-12-09 18:47:43 +000027#ifdef __sgi
28/* This is missing from unistd.h */
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000029extern void bzero(void *, int);
Guido van Rossum37273171996-12-09 18:47:43 +000030#endif
31
Guido van Rossumff7e83d1999-08-27 20:39:37 +000032#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000033#include <sys/types.h>
Guido van Rossumff7e83d1999-08-27 20:39:37 +000034#endif
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000035
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000036#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000037#include <sys/time.h>
38#include <utils.h>
39#endif
40
Guido van Rossum6f489d91996-06-28 20:15:15 +000041#ifdef MS_WINDOWS
Thomas Heller7bdabe62002-09-24 17:03:26 +000042#include <winsock.h>
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000043#else
Guido van Rossumbcc20741998-08-04 22:53:56 +000044#ifdef __BEOS__
45#include <net/socket.h>
46#define SOCKET int
47#else
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000048#define SOCKET int
49#endif
Guido van Rossumbcc20741998-08-04 22:53:56 +000050#endif
Guido van Rossumed233a51992-06-23 09:07:03 +000051
Guido van Rossum1ca8bb32001-03-02 06:28:17 +000052
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000053static PyObject *SelectError;
Guido van Rossumed233a51992-06-23 09:07:03 +000054
Barry Warsawc1cb3601996-12-12 22:16:21 +000055/* list of Python objects and their file descriptor */
56typedef struct {
57 PyObject *obj; /* owned reference */
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000058 SOCKET fd;
Barry Warsawc1cb3601996-12-12 22:16:21 +000059 int sentinel; /* -1 == sentinel */
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000060} pylist;
61
Barry Warsawc1cb3601996-12-12 22:16:21 +000062static void
Tim Peters4b046c22001-08-16 21:59:46 +000063reap_obj(pylist fd2obj[FD_SETSIZE + 1])
Barry Warsawc1cb3601996-12-12 22:16:21 +000064{
65 int i;
Tim Peters4b046c22001-08-16 21:59:46 +000066 for (i = 0; i < FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) {
Barry Warsawc1cb3601996-12-12 22:16:21 +000067 Py_XDECREF(fd2obj[i].obj);
68 fd2obj[i].obj = NULL;
69 }
70 fd2obj[0].sentinel = -1;
71}
72
73
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000074/* returns -1 and sets the Python exception if an error occurred, otherwise
75 returns a number >= 0
76*/
Guido van Rossum4f0fbf81996-06-12 04:22:53 +000077static int
Tim Peters4b046c22001-08-16 21:59:46 +000078list2set(PyObject *list, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +000079{
Barry Warsawc1cb3601996-12-12 22:16:21 +000080 int i;
81 int max = -1;
82 int index = 0;
83 int len = PyList_Size(list);
84 PyObject* o = NULL;
Guido van Rossum07432c01995-03-29 16:47:45 +000085
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000086 fd2obj[0].obj = (PyObject*)0; /* set list to zero size */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +000087 FD_ZERO(set);
Barry Warsawc1cb3601996-12-12 22:16:21 +000088
89 for (i = 0; i < len; i++) {
Barry Warsawc1cb3601996-12-12 22:16:21 +000090 SOCKET v;
91
92 /* any intervening fileno() calls could decr this refcnt */
Barry Warsaw24c4b3d1996-12-13 23:22:42 +000093 if (!(o = PyList_GetItem(list, i)))
Barry Warsaw529fcfe1996-12-16 18:15:34 +000094 return -1;
Barry Warsaw24c4b3d1996-12-13 23:22:42 +000095
Barry Warsawc1cb3601996-12-12 22:16:21 +000096 Py_INCREF(o);
Andrew M. Kuchling9f28a032000-07-13 23:59:35 +000097 v = PyObject_AsFileDescriptor( o );
98 if (v == -1) goto finally;
Barry Warsawc1cb3601996-12-12 22:16:21 +000099
Guido van Rossum947a0fa2000-01-14 16:33:09 +0000100#if defined(_MSC_VER)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000101 max = 0; /* not used for Win32 */
102#else /* !_MSC_VER */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000103 if (v < 0 || v >= FD_SETSIZE) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000104 PyErr_SetString(PyExc_ValueError,
105 "filedescriptor out of range in select()");
106 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000107 }
108 if (v > max)
109 max = v;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000110#endif /* _MSC_VER */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000111 FD_SET(v, set);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000112
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000113 /* add object and its file descriptor to the list */
114 if (index >= FD_SETSIZE) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000115 PyErr_SetString(PyExc_ValueError,
116 "too many file descriptors in select()");
117 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000118 }
119 fd2obj[index].obj = o;
120 fd2obj[index].fd = v;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000121 fd2obj[index].sentinel = 0;
122 fd2obj[++index].sentinel = -1;
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000123 }
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000124 return max+1;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000125
126 finally:
127 Py_XDECREF(o);
128 return -1;
Guido van Rossumed233a51992-06-23 09:07:03 +0000129}
130
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000131/* returns NULL and sets the Python exception if an error occurred */
132static PyObject *
Tim Peters4b046c22001-08-16 21:59:46 +0000133set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
Guido van Rossumed233a51992-06-23 09:07:03 +0000134{
Barry Warsawc1cb3601996-12-12 22:16:21 +0000135 int i, j, count=0;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000136 PyObject *list, *o;
137 SOCKET fd;
Guido van Rossumed233a51992-06-23 09:07:03 +0000138
Barry Warsawc1cb3601996-12-12 22:16:21 +0000139 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000140 if (FD_ISSET(fd2obj[j].fd, set))
Barry Warsawc1cb3601996-12-12 22:16:21 +0000141 count++;
142 }
143 list = PyList_New(count);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000144 if (!list)
145 return NULL;
146
Barry Warsawc1cb3601996-12-12 22:16:21 +0000147 i = 0;
148 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000149 fd = fd2obj[j].fd;
150 if (FD_ISSET(fd, set)) {
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000151#ifndef _MSC_VER
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000152 if (fd > FD_SETSIZE) {
153 PyErr_SetString(PyExc_SystemError,
154 "filedescriptor out of range returned in select()");
Barry Warsawc1cb3601996-12-12 22:16:21 +0000155 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000156 }
Guido van Rossum4f0fbf81996-06-12 04:22:53 +0000157#endif
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000158 o = fd2obj[j].obj;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000159 fd2obj[j].obj = NULL;
160 /* transfer ownership */
161 if (PyList_SetItem(list, i, o) < 0)
162 goto finally;
163
164 i++;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000165 }
166 }
167 return list;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000168 finally:
169 Py_DECREF(list);
170 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000171}
Barry Warsawc1cb3601996-12-12 22:16:21 +0000172
Barry Warsawb44740f2001-08-16 16:52:59 +0000173#undef SELECT_USES_HEAP
174#if FD_SETSIZE > 1024
175#define SELECT_USES_HEAP
176#endif /* FD_SETSIZE > 1024 */
177
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000178static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000179select_select(PyObject *self, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000180{
Barry Warsawb44740f2001-08-16 16:52:59 +0000181#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000182 pylist *rfd2obj, *wfd2obj, *efd2obj;
Barry Warsawb44740f2001-08-16 16:52:59 +0000183#else /* !SELECT_USES_HEAP */
Tim Peters4b046c22001-08-16 21:59:46 +0000184 /* XXX: All this should probably be implemented as follows:
Barry Warsawb44740f2001-08-16 16:52:59 +0000185 * - find the highest descriptor we're interested in
186 * - add one
187 * - that's the size
188 * See: Stevens, APitUE, $12.5.1
189 */
Tim Peters4b046c22001-08-16 21:59:46 +0000190 pylist rfd2obj[FD_SETSIZE + 1];
191 pylist wfd2obj[FD_SETSIZE + 1];
192 pylist efd2obj[FD_SETSIZE + 1];
Barry Warsawb44740f2001-08-16 16:52:59 +0000193#endif /* SELECT_USES_HEAP */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000194 PyObject *ifdlist, *ofdlist, *efdlist;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000195 PyObject *ret = NULL;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000196 PyObject *tout = Py_None;
197 fd_set ifdset, ofdset, efdset;
198 double timeout;
199 struct timeval tv, *tvp;
Guido van Rossum3262e162000-06-28 21:18:13 +0000200 long seconds;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000201 int imax, omax, emax, max;
202 int n;
Guido van Rossumed233a51992-06-23 09:07:03 +0000203
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000204 /* convert arguments */
Guido van Rossum43713e52000-02-29 13:59:29 +0000205 if (!PyArg_ParseTuple(args, "OOO|O:select",
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000206 &ifdlist, &ofdlist, &efdlist, &tout))
207 return NULL;
Guido van Rossumed233a51992-06-23 09:07:03 +0000208
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000209 if (tout == Py_None)
210 tvp = (struct timeval *)0;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000211 else if (!PyNumber_Check(tout)) {
Barry Warsawc1cb3601996-12-12 22:16:21 +0000212 PyErr_SetString(PyExc_TypeError,
213 "timeout must be a float or None");
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000214 return NULL;
Barry Warsawc1cb3601996-12-12 22:16:21 +0000215 }
Guido van Rossumc7a22701993-11-01 16:27:16 +0000216 else {
Neil Schemenauer47ec6c02002-11-18 16:02:29 +0000217 timeout = PyFloat_AsDouble(tout);
218 if (timeout == -1 && PyErr_Occurred())
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000219 return NULL;
Guido van Rossum3262e162000-06-28 21:18:13 +0000220 if (timeout > (double)LONG_MAX) {
Barry Warsaw2f704552001-08-16 16:55:10 +0000221 PyErr_SetString(PyExc_OverflowError,
222 "timeout period too long");
Guido van Rossum3262e162000-06-28 21:18:13 +0000223 return NULL;
224 }
225 seconds = (long)timeout;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000226 timeout = timeout - (double)seconds;
227 tv.tv_sec = seconds;
Guido van Rossum3262e162000-06-28 21:18:13 +0000228 tv.tv_usec = (long)(timeout*1000000.0);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000229 tvp = &tv;
Guido van Rossumc7a22701993-11-01 16:27:16 +0000230 }
Guido van Rossumed233a51992-06-23 09:07:03 +0000231
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000232 /* sanity check first three arguments */
233 if (!PyList_Check(ifdlist) ||
234 !PyList_Check(ofdlist) ||
235 !PyList_Check(efdlist))
236 {
237 PyErr_SetString(PyExc_TypeError,
238 "arguments 1-3 must be lists");
239 return NULL;
240 }
Guido van Rossumed233a51992-06-23 09:07:03 +0000241
Barry Warsawb44740f2001-08-16 16:52:59 +0000242#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000243 /* Allocate memory for the lists */
Tim Peters4b046c22001-08-16 21:59:46 +0000244 rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
245 wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
246 efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
Guido van Rossumd20781b1998-07-02 02:53:36 +0000247 if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000248 if (rfd2obj) PyMem_DEL(rfd2obj);
249 if (wfd2obj) PyMem_DEL(wfd2obj);
250 if (efd2obj) PyMem_DEL(efd2obj);
Tim Peters5f322d32003-02-11 17:18:58 +0000251 return PyErr_NoMemory();
Guido van Rossumd20781b1998-07-02 02:53:36 +0000252 }
Barry Warsawb44740f2001-08-16 16:52:59 +0000253#endif /* SELECT_USES_HEAP */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000254 /* Convert lists to fd_sets, and get maximum fd number
255 * propagates the Python exception set in list2set()
256 */
Barry Warsawc1cb3601996-12-12 22:16:21 +0000257 rfd2obj[0].sentinel = -1;
258 wfd2obj[0].sentinel = -1;
259 efd2obj[0].sentinel = -1;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000260 if ((imax=list2set(ifdlist, &ifdset, rfd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000261 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000262 if ((omax=list2set(ofdlist, &ofdset, wfd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000263 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000264 if ((emax=list2set(efdlist, &efdset, efd2obj)) < 0)
Barry Warsawc1cb3601996-12-12 22:16:21 +0000265 goto finally;
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000266 max = imax;
267 if (omax > max) max = omax;
268 if (emax > max) max = emax;
Guido van Rossumed233a51992-06-23 09:07:03 +0000269
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000270 Py_BEGIN_ALLOW_THREADS
271 n = select(max, &ifdset, &ofdset, &efdset, tvp);
272 Py_END_ALLOW_THREADS
Guido van Rossumed233a51992-06-23 09:07:03 +0000273
Thomas Heller106f4c72002-09-24 16:51:00 +0000274#ifdef MS_WINDOWS
275 if (n == SOCKET_ERROR) {
276 PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError());
277 }
278#else
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000279 if (n < 0) {
280 PyErr_SetFromErrno(SelectError);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000281 }
Thomas Heller106f4c72002-09-24 16:51:00 +0000282#endif
Barry Warsawc1cb3601996-12-12 22:16:21 +0000283 else if (n == 0) {
284 /* optimization */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000285 ifdlist = PyList_New(0);
Barry Warsawc1cb3601996-12-12 22:16:21 +0000286 if (ifdlist) {
287 ret = Py_BuildValue("OOO", ifdlist, ifdlist, ifdlist);
288 Py_DECREF(ifdlist);
289 }
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000290 }
Barry Warsawc1cb3601996-12-12 22:16:21 +0000291 else {
292 /* any of these three calls can raise an exception. it's more
293 convenient to test for this after all three calls... but
294 is that acceptable?
295 */
296 ifdlist = set2list(&ifdset, rfd2obj);
297 ofdlist = set2list(&ofdset, wfd2obj);
298 efdlist = set2list(&efdset, efd2obj);
299 if (PyErr_Occurred())
300 ret = NULL;
301 else
302 ret = Py_BuildValue("OOO", ifdlist, ofdlist, efdlist);
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000303
Barry Warsawc1cb3601996-12-12 22:16:21 +0000304 Py_DECREF(ifdlist);
305 Py_DECREF(ofdlist);
306 Py_DECREF(efdlist);
307 }
308
309 finally:
310 reap_obj(rfd2obj);
311 reap_obj(wfd2obj);
312 reap_obj(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000313#ifdef SELECT_USES_HEAP
Guido van Rossumd20781b1998-07-02 02:53:36 +0000314 PyMem_DEL(rfd2obj);
315 PyMem_DEL(wfd2obj);
316 PyMem_DEL(efd2obj);
Barry Warsawb44740f2001-08-16 16:52:59 +0000317#endif /* SELECT_USES_HEAP */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000318 return ret;
Guido van Rossumed233a51992-06-23 09:07:03 +0000319}
320
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000321#ifdef HAVE_POLL
322/*
323 * poll() support
324 */
325
326typedef struct {
327 PyObject_HEAD
328 PyObject *dict;
329 int ufd_uptodate;
330 int ufd_len;
331 struct pollfd *ufds;
332} pollObject;
333
Jeremy Hylton938ace62002-07-17 16:30:39 +0000334static PyTypeObject poll_Type;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000335
336/* Update the malloc'ed array of pollfds to match the dictionary
337 contained within a pollObject. Return 1 on success, 0 on an error.
338*/
339
340static int
341update_ufd_array(pollObject *self)
342{
Fred Drakedff3a372001-07-19 21:29:49 +0000343 int i, pos;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000344 PyObject *key, *value;
345
346 self->ufd_len = PyDict_Size(self->dict);
347 PyMem_Resize(self->ufds, struct pollfd, self->ufd_len);
348 if (self->ufds == NULL) {
349 PyErr_NoMemory();
350 return 0;
351 }
352
353 i = pos = 0;
Fred Drakedff3a372001-07-19 21:29:49 +0000354 while (PyDict_Next(self->dict, &pos, &key, &value)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000355 self->ufds[i].fd = PyInt_AsLong(key);
Fred Drakedff3a372001-07-19 21:29:49 +0000356 self->ufds[i].events = (short)PyInt_AsLong(value);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000357 i++;
358 }
359 self->ufd_uptodate = 1;
360 return 1;
361}
362
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000363PyDoc_STRVAR(poll_register_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000364"register(fd [, eventmask] ) -> None\n\n\
365Register a file descriptor with the polling object.\n\
Barry Warsaw2f704552001-08-16 16:55:10 +0000366fd -- either an integer, or an object with a fileno() method returning an\n\
367 int.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000368events -- an optional bitmask describing the type of events to check for");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000369
370static PyObject *
371poll_register(pollObject *self, PyObject *args)
372{
373 PyObject *o, *key, *value;
374 int fd, events = POLLIN | POLLPRI | POLLOUT;
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000375 int err;
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000376
Fred Drake7b87f852001-05-21 03:29:05 +0000377 if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000378 return NULL;
379 }
380
381 fd = PyObject_AsFileDescriptor(o);
382 if (fd == -1) return NULL;
383
384 /* Add entry to the internal dictionary: the key is the
385 file descriptor, and the value is the event mask. */
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000386 key = PyInt_FromLong(fd);
387 if (key == NULL)
388 return NULL;
389 value = PyInt_FromLong(events);
390 if (value == NULL) {
391 Py_DECREF(key);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000392 return NULL;
393 }
Guido van Rossuma0dfc852001-10-25 20:18:35 +0000394 err = PyDict_SetItem(self->dict, key, value);
395 Py_DECREF(key);
396 Py_DECREF(value);
397 if (err < 0)
398 return NULL;
399
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000400 self->ufd_uptodate = 0;
401
402 Py_INCREF(Py_None);
403 return Py_None;
404}
405
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000406PyDoc_STRVAR(poll_unregister_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000407"unregister(fd) -> None\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000408Remove a file descriptor being tracked by the polling object.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000409
410static PyObject *
411poll_unregister(pollObject *self, PyObject *args)
412{
413 PyObject *o, *key;
414 int fd;
415
Fred Drake7b87f852001-05-21 03:29:05 +0000416 if (!PyArg_ParseTuple(args, "O:unregister", &o)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000417 return NULL;
418 }
419
420 fd = PyObject_AsFileDescriptor( o );
421 if (fd == -1)
422 return NULL;
423
424 /* Check whether the fd is already in the array */
425 key = PyInt_FromLong(fd);
426 if (key == NULL)
427 return NULL;
428
429 if (PyDict_DelItem(self->dict, key) == -1) {
430 Py_DECREF(key);
431 /* This will simply raise the KeyError set by PyDict_DelItem
432 if the file descriptor isn't registered. */
433 return NULL;
434 }
435
436 Py_DECREF(key);
437 self->ufd_uptodate = 0;
438
439 Py_INCREF(Py_None);
440 return Py_None;
441}
442
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000443PyDoc_STRVAR(poll_poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000444"poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
445Polls the set of registered file descriptors, returning a list containing \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000446any descriptors that have events or errors to report.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000447
448static PyObject *
449poll_poll(pollObject *self, PyObject *args)
450{
451 PyObject *result_list = NULL, *tout = NULL;
452 int timeout = 0, poll_result, i, j;
453 PyObject *value = NULL, *num = NULL;
454
Fred Drake7b87f852001-05-21 03:29:05 +0000455 if (!PyArg_ParseTuple(args, "|O:poll", &tout)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000456 return NULL;
457 }
458
459 /* Check values for timeout */
460 if (tout == NULL || tout == Py_None)
461 timeout = -1;
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000462 else if (!PyNumber_Check(tout)) {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000463 PyErr_SetString(PyExc_TypeError,
464 "timeout must be an integer or None");
465 return NULL;
466 }
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000467 else {
468 tout = PyNumber_Int(tout);
469 if (!tout)
470 return NULL;
Walter Dörwald08c4cc42002-11-12 11:42:20 +0000471 timeout = PyInt_AsLong(tout);
Neal Norwitz77c72bb2002-07-28 15:12:10 +0000472 Py_DECREF(tout);
473 }
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000474
475 /* Ensure the ufd array is up to date */
476 if (!self->ufd_uptodate)
477 if (update_ufd_array(self) == 0)
478 return NULL;
479
480 /* call poll() */
481 Py_BEGIN_ALLOW_THREADS;
482 poll_result = poll(self->ufds, self->ufd_len, timeout);
483 Py_END_ALLOW_THREADS;
484
485 if (poll_result < 0) {
486 PyErr_SetFromErrno(SelectError);
487 return NULL;
488 }
489
490 /* build the result list */
491
492 result_list = PyList_New(poll_result);
493 if (!result_list)
494 return NULL;
495 else {
496 for (i = 0, j = 0; j < poll_result; j++) {
497 /* skip to the next fired descriptor */
498 while (!self->ufds[i].revents) {
499 i++;
500 }
501 /* if we hit a NULL return, set value to NULL
502 and break out of loop; code at end will
503 clean up result_list */
504 value = PyTuple_New(2);
505 if (value == NULL)
506 goto error;
507 num = PyInt_FromLong(self->ufds[i].fd);
508 if (num == NULL) {
509 Py_DECREF(value);
510 goto error;
511 }
512 PyTuple_SET_ITEM(value, 0, num);
513
514 num = PyInt_FromLong(self->ufds[i].revents);
515 if (num == NULL) {
516 Py_DECREF(value);
517 goto error;
518 }
519 PyTuple_SET_ITEM(value, 1, num);
520 if ((PyList_SetItem(result_list, j, value)) == -1) {
521 Py_DECREF(value);
522 goto error;
523 }
524 i++;
525 }
526 }
527 return result_list;
528
529 error:
530 Py_DECREF(result_list);
531 return NULL;
532}
533
534static PyMethodDef poll_methods[] = {
535 {"register", (PyCFunction)poll_register,
536 METH_VARARGS, poll_register_doc},
537 {"unregister", (PyCFunction)poll_unregister,
538 METH_VARARGS, poll_unregister_doc},
539 {"poll", (PyCFunction)poll_poll,
540 METH_VARARGS, poll_poll_doc},
541 {NULL, NULL} /* sentinel */
542};
543
544static pollObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000545newPollObject(void)
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000546{
547 pollObject *self;
548 self = PyObject_New(pollObject, &poll_Type);
549 if (self == NULL)
550 return NULL;
551 /* ufd_uptodate is a Boolean, denoting whether the
552 array pointed to by ufds matches the contents of the dictionary. */
553 self->ufd_uptodate = 0;
554 self->ufds = NULL;
555 self->dict = PyDict_New();
556 if (self->dict == NULL) {
557 Py_DECREF(self);
558 return NULL;
559 }
560 return self;
561}
562
563static void
564poll_dealloc(pollObject *self)
565{
566 if (self->ufds != NULL)
567 PyMem_DEL(self->ufds);
568 Py_XDECREF(self->dict);
569 PyObject_Del(self);
570}
571
572static PyObject *
573poll_getattr(pollObject *self, char *name)
574{
575 return Py_FindMethod(poll_methods, (PyObject *)self, name);
576}
577
Tim Peters0c322792002-07-17 16:49:03 +0000578static PyTypeObject poll_Type = {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000579 /* The ob_type field must be initialized in the module init function
580 * to be portable to Windows without using C++. */
581 PyObject_HEAD_INIT(NULL)
582 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +0000583 "select.poll", /*tp_name*/
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000584 sizeof(pollObject), /*tp_basicsize*/
585 0, /*tp_itemsize*/
586 /* methods */
587 (destructor)poll_dealloc, /*tp_dealloc*/
588 0, /*tp_print*/
589 (getattrfunc)poll_getattr, /*tp_getattr*/
590 0, /*tp_setattr*/
591 0, /*tp_compare*/
592 0, /*tp_repr*/
593 0, /*tp_as_number*/
594 0, /*tp_as_sequence*/
595 0, /*tp_as_mapping*/
596 0, /*tp_hash*/
597};
598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000599PyDoc_STRVAR(poll_doc,
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000600"Returns a polling object, which supports registering and\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000601unregistering file descriptors, and then polling them for I/O events.");
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000602
603static PyObject *
604select_poll(PyObject *self, PyObject *args)
605{
606 pollObject *rv;
607
608 if (!PyArg_ParseTuple(args, ":poll"))
609 return NULL;
610 rv = newPollObject();
611 if ( rv == NULL )
612 return NULL;
613 return (PyObject *)rv;
614}
615#endif /* HAVE_POLL */
616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000617PyDoc_STRVAR(select_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000618"select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
619\n\
620Wait until one or more file descriptors are ready for some kind of I/O.\n\
621The first three arguments are lists of file descriptors to be waited for:\n\
622rlist -- wait until ready for reading\n\
623wlist -- wait until ready for writing\n\
624xlist -- wait for an ``exceptional condition''\n\
625If only one kind of condition is required, pass [] for the other lists.\n\
626A file descriptor is either a socket or file object, or a small integer\n\
627gotten from a fileno() method call on one of those.\n\
628\n\
629The optional 4th argument specifies a timeout in seconds; it may be\n\
630a floating point number to specify fractions of seconds. If it is absent\n\
631or None, the call will never time out.\n\
632\n\
633The return value is a tuple of three lists corresponding to the first three\n\
634arguments; each contains the subset of the corresponding file descriptors\n\
635that are ready.\n\
636\n\
637*** IMPORTANT NOTICE ***\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000638On Windows, only sockets are supported; on Unix, all file descriptors.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000639
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000640static PyMethodDef select_methods[] = {
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000641 {"select", select_select, METH_VARARGS, select_doc},
642#ifdef HAVE_POLL
643 {"poll", select_poll, METH_VARARGS, poll_doc},
644#endif /* HAVE_POLL */
Barry Warsawe4ac0aa1996-12-12 00:04:35 +0000645 {0, 0}, /* sentinel */
Guido van Rossumed233a51992-06-23 09:07:03 +0000646};
647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000648PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000649"This module supports asynchronous I/O on multiple file descriptors.\n\
650\n\
651*** IMPORTANT NOTICE ***\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000652On Windows, only sockets are supported; on Unix, all file descriptors.");
Guido van Rossumed233a51992-06-23 09:07:03 +0000653
Mark Hammond62b1ab12002-07-23 06:31:15 +0000654PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000655initselect(void)
Guido van Rossumed233a51992-06-23 09:07:03 +0000656{
Fred Drake4baedc12002-04-01 14:53:37 +0000657 PyObject *m;
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000658 m = Py_InitModule3("select", select_methods, module_doc);
Fred Drake4baedc12002-04-01 14:53:37 +0000659
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000660 SelectError = PyErr_NewException("select.error", NULL, NULL);
Fred Drake4baedc12002-04-01 14:53:37 +0000661 Py_INCREF(SelectError);
662 PyModule_AddObject(m, "error", SelectError);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000663#ifdef HAVE_POLL
664 poll_Type.ob_type = &PyType_Type;
Fred Drake4baedc12002-04-01 14:53:37 +0000665 PyModule_AddIntConstant(m, "POLLIN", POLLIN);
666 PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
667 PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
668 PyModule_AddIntConstant(m, "POLLERR", POLLERR);
669 PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
670 PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000671
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +0000672#ifdef POLLRDNORM
Fred Drake4baedc12002-04-01 14:53:37 +0000673 PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +0000674#endif
675#ifdef POLLRDBAND
Fred Drake4baedc12002-04-01 14:53:37 +0000676 PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +0000677#endif
678#ifdef POLLWRNORM
Fred Drake4baedc12002-04-01 14:53:37 +0000679 PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +0000680#endif
681#ifdef POLLWRBAND
Fred Drake4baedc12002-04-01 14:53:37 +0000682 PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
Andrew M. Kuchling36d97eb2000-09-28 21:33:44 +0000683#endif
Sjoerd Mullender239f8362000-08-25 13:59:18 +0000684#ifdef POLLMSG
Fred Drake4baedc12002-04-01 14:53:37 +0000685 PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
Sjoerd Mullender239f8362000-08-25 13:59:18 +0000686#endif
Andrew M. Kuchlingcf96dc82000-08-25 01:15:33 +0000687#endif /* HAVE_POLL */
Guido van Rossumed233a51992-06-23 09:07:03 +0000688}