annotate Modules/selectmodule.c @ 48090:2da42dcbb8ce 2.5

Backport code from r65182: Issue #2620: Overflow checking when allocating or reallocating memory was not always being done properly in some python types and extension modules. PyMem_MALLOC, PyMem_REALLOC, PyMem_NEW and PyMem_RESIZE have all been updated to perform better checks and places in the code that would previously leak memory on the error path when such an allocation failed have been fixed.
author Neal Norwitz <nnorwitz@gmail.com>
date Mon, 28 Jul 2008 05:06:20 +0000
parents c67b23397f30
children 787b969d37f0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
1 /* select - Module containing unix select(2) call.
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
2 Under Unix, the file descriptors are small integers.
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
3 Under Win32, select only exists for sockets, and sockets may
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
4 have any value except INVALID_SOCKET.
8823
f2a4a2b60860 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8616
diff changeset
5 Under BeOS, we suffer the same dichotomy as Win32; sockets can be anything
f2a4a2b60860 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8616
diff changeset
6 >= 0.
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
7 */
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
9 #include "Python.h"
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
11 #ifdef __APPLE__
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
12 /* Perform runtime testing for a broken poll on OSX to make it easier
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
13 * to use the same binary on multiple releases of the OS.
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
14 */
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
15 #undef HAVE_BROKEN_POLL
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
16 #endif
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
17
15512
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
18 /* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
19 64 is too small (too many people have bumped into that limit).
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
20 Here we boost it.
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
21 Users who want even more than the boosted limit should #define
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
22 FD_SETSIZE higher before this; e.g., via compiler /D switch.
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
23 */
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
24 #if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
25 #define FD_SETSIZE 512
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
26 #endif
e11c12323ebf SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents: 14918
diff changeset
27
18603
b9d47d083d2c [Bug #438050]
Andrew M. Kuchling <amk@amk.ca>
parents: 17873
diff changeset
28 #if defined(HAVE_POLL_H)
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
29 #include <poll.h>
18603
b9d47d083d2c [Bug #438050]
Andrew M. Kuchling <amk@amk.ca>
parents: 17873
diff changeset
30 #elif defined(HAVE_SYS_POLL_H)
b9d47d083d2c [Bug #438050]
Andrew M. Kuchling <amk@amk.ca>
parents: 17873
diff changeset
31 #include <sys/poll.h>
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
32 #endif
4600
d36250aefb82 Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
33
4621
a2f171ce25f8 Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4600
diff changeset
34 #ifdef __sgi
a2f171ce25f8 Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4600
diff changeset
35 /* This is missing from unistd.h */
13667
a6c7bfdd6777 Even more ANSIfication: fix as many function pointers and declarations as
Thomas Wouters <thomas@python.org>
parents: 13656
diff changeset
36 extern void bzero(void *, int);
4621
a2f171ce25f8 Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4600
diff changeset
37 #endif
a2f171ce25f8 Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4600
diff changeset
38
38716
42808526511c Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 38489
diff changeset
39 #ifdef HAVE_SYS_TYPES_H
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1392
diff changeset
40 #include <sys/types.h>
11243
6aac31cd2102 Patch by Mark Hammond to avoid certain header files on Windows/CE.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
41 #endif
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
42
22114
c454b76d51e7 OS/2 EMX port changes (Modules part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21712
diff changeset
43 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
6626
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 6367
diff changeset
44 #include <sys/time.h>
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 6367
diff changeset
45 #include <utils.h>
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 6367
diff changeset
46 #endif
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 6367
diff changeset
47
3738
ce74bba8a6a6 Slightly different Windows ifdefs
Guido van Rossum <guido@python.org>
parents: 3675
diff changeset
48 #ifdef MS_WINDOWS
39043
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
49 # include <winsock.h>
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
50 #else
39043
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
51 # define SOCKET int
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
52 # ifdef __BEOS__
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
53 # include <net/socket.h>
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
54 # elif defined(__VMS)
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
55 # include <socket.h>
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
56 # endif
8823
f2a4a2b60860 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8616
diff changeset
57 #endif
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
16946
31e302e94da8 RISCOS changes by dschwertberger
Guido van Rossum <guido@python.org>
parents: 15512
diff changeset
59
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
60 static PyObject *SelectError;
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
62 /* list of Python objects and their file descriptor */
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
63 typedef struct {
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
64 PyObject *obj; /* owned reference */
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
65 SOCKET fd;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
66 int sentinel; /* -1 == sentinel */
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
67 } pylist;
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
68
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
69 static void
19328
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
70 reap_obj(pylist fd2obj[FD_SETSIZE + 1])
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
71 {
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
72 int i;
19328
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
73 for (i = 0; i < FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) {
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
74 Py_XDECREF(fd2obj[i].obj);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
75 fd2obj[i].obj = NULL;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
76 }
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
77 fd2obj[0].sentinel = -1;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
78 }
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
79
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
80
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
81 /* returns -1 and sets the Python exception if an error occurred, otherwise
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
82 returns a number >= 0
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
83 */
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
84 static int
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
85 seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 {
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
87 int i;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
88 int max = -1;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
89 int index = 0;
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
90 int len = -1;
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
91 PyObject* fast_seq = NULL;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
92 PyObject* o = NULL;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
93
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
94 fd2obj[0].obj = (PyObject*)0; /* set list to zero size */
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
95 FD_ZERO(set);
2611
01687ce43708 fix subtle refcnt bug
Guido van Rossum <guido@python.org>
parents: 2061
diff changeset
96
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
97 fast_seq=PySequence_Fast(seq, "arguments 1-3 must be sequences");
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
98 if (!fast_seq)
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
99 return -1;
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
100
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
101 len = PySequence_Fast_GET_SIZE(fast_seq);
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
102
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
103 for (i = 0; i < len; i++) {
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
104 SOCKET v;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
105
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
106 /* any intervening fileno() calls could decr this refcnt */
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
107 if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i)))
4734
3db423515626 list2set(): correct return value (an int, not a PyObject*).
Barry Warsaw <barry@python.org>
parents: 4730
diff changeset
108 return -1;
4730
62cf7d589300 list2set(): PyList_GetItem could fail.
Barry Warsaw <barry@python.org>
parents: 4700
diff changeset
109
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
110 Py_INCREF(o);
13593
df64cc0e84e2 Use PyObject_AsFileDescriptor
Andrew M. Kuchling <amk@amk.ca>
parents: 13550
diff changeset
111 v = PyObject_AsFileDescriptor( o );
df64cc0e84e2 Use PyObject_AsFileDescriptor
Andrew M. Kuchling <amk@amk.ca>
parents: 13550
diff changeset
112 if (v == -1) goto finally;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
113
11656
db756d31e727 According to Ron Bickers, and with apparent approval of Chris
Guido van Rossum <guido@python.org>
parents: 11243
diff changeset
114 #if defined(_MSC_VER)
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
115 max = 0; /* not used for Win32 */
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
116 #else /* !_MSC_VER */
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
117 if (v < 0 || v >= FD_SETSIZE) {
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
118 PyErr_SetString(PyExc_ValueError,
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
119 "filedescriptor out of range in select()");
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
120 goto finally;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
121 }
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
122 if (v > max)
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
123 max = v;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
124 #endif /* _MSC_VER */
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
125 FD_SET(v, set);
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
126
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
127 /* add object and its file descriptor to the list */
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
128 if (index >= FD_SETSIZE) {
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
129 PyErr_SetString(PyExc_ValueError,
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
130 "too many file descriptors in select()");
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
131 goto finally;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
132 }
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
133 fd2obj[index].obj = o;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
134 fd2obj[index].fd = v;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
135 fd2obj[index].sentinel = 0;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
136 fd2obj[++index].sentinel = -1;
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 }
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
138 Py_DECREF(fast_seq);
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
139 return max+1;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
140
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
141 finally:
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
142 Py_XDECREF(o);
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
143 Py_DECREF(fast_seq);
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
144 return -1;
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 }
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
146
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
147 /* returns NULL and sets the Python exception if an error occurred */
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
148 static PyObject *
19328
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
149 set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 {
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
151 int i, j, count=0;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
152 PyObject *list, *o;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
153 SOCKET fd;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
154
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
155 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
156 if (FD_ISSET(fd2obj[j].fd, set))
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
157 count++;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
158 }
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
159 list = PyList_New(count);
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
160 if (!list)
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
161 return NULL;
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
162
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
163 i = 0;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
164 for (j = 0; fd2obj[j].sentinel >= 0; j++) {
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
165 fd = fd2obj[j].fd;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
166 if (FD_ISSET(fd, set)) {
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
167 #ifndef _MSC_VER
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
168 if (fd > FD_SETSIZE) {
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
169 PyErr_SetString(PyExc_SystemError,
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
170 "filedescriptor out of range returned in select()");
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
171 goto finally;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
172 }
3675
d617de15774b Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents: 2611
diff changeset
173 #endif
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
174 o = fd2obj[j].obj;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
175 fd2obj[j].obj = NULL;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
176 /* transfer ownership */
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
177 if (PyList_SetItem(list, i, o) < 0)
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
178 goto finally;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
179
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
180 i++;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
181 }
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
182 }
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
183 return list;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
184 finally:
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
185 Py_DECREF(list);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
186 return NULL;
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 }
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
188
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
189 #undef SELECT_USES_HEAP
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
190 #if FD_SETSIZE > 1024
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
191 #define SELECT_USES_HEAP
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
192 #endif /* FD_SETSIZE > 1024 */
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
193
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
194 static PyObject *
13502
7348cceee8fa ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
195 select_select(PyObject *self, PyObject *args)
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 {
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
197 #ifdef SELECT_USES_HEAP
8616
2417f17fa3e5 On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents: 8570
diff changeset
198 pylist *rfd2obj, *wfd2obj, *efd2obj;
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
199 #else /* !SELECT_USES_HEAP */
19328
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
200 /* XXX: All this should probably be implemented as follows:
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
201 * - find the highest descriptor we're interested in
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
202 * - add one
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
203 * - that's the size
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
204 * See: Stevens, APitUE, $12.5.1
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
205 */
19328
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
206 pylist rfd2obj[FD_SETSIZE + 1];
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
207 pylist wfd2obj[FD_SETSIZE + 1];
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
208 pylist efd2obj[FD_SETSIZE + 1];
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
209 #endif /* SELECT_USES_HEAP */
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
210 PyObject *ifdlist, *ofdlist, *efdlist;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
211 PyObject *ret = NULL;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
212 PyObject *tout = Py_None;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
213 fd_set ifdset, ofdset, efdset;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
214 double timeout;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
215 struct timeval tv, *tvp;
13079
185003d09e76 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
216 long seconds;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
217 int imax, omax, emax, max;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
218 int n;
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
219
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
220 /* convert arguments */
38489
3fe3ccdf0155 Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents: 37935
diff changeset
221 if (!PyArg_UnpackTuple(args, "select", 3, 4,
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
222 &ifdlist, &ofdlist, &efdlist, &tout))
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
223 return NULL;
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
225 if (tout == Py_None)
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
226 tvp = (struct timeval *)0;
24408
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
227 else if (!PyNumber_Check(tout)) {
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
228 PyErr_SetString(PyExc_TypeError,
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
229 "timeout must be a float or None");
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
230 return NULL;
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
231 }
1390
cffe8d6b2f09 * selectmodule.c (select_select): timeout argument may be None with same
Guido van Rossum <guido@python.org>
parents: 1284
diff changeset
232 else {
26270
e270c0d41a05 Don't use PyNumber_Float() since it's is nearly useless. Instead, rely on
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26153
diff changeset
233 timeout = PyFloat_AsDouble(tout);
e270c0d41a05 Don't use PyNumber_Float() since it's is nearly useless. Instead, rely on
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26153
diff changeset
234 if (timeout == -1 && PyErr_Occurred())
24408
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
235 return NULL;
13079
185003d09e76 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
236 if (timeout > (double)LONG_MAX) {
19311
fc7617312182 Fixed a couple of minor formatting nits where lines were > 79 columns wide.
Barry Warsaw <barry@python.org>
parents: 19310
diff changeset
237 PyErr_SetString(PyExc_OverflowError,
fc7617312182 Fixed a couple of minor formatting nits where lines were > 79 columns wide.
Barry Warsaw <barry@python.org>
parents: 19310
diff changeset
238 "timeout period too long");
13079
185003d09e76 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
239 return NULL;
185003d09e76 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
240 }
185003d09e76 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
241 seconds = (long)timeout;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
242 timeout = timeout - (double)seconds;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
243 tv.tv_sec = seconds;
13079
185003d09e76 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
244 tv.tv_usec = (long)(timeout*1000000.0);
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
245 tvp = &tv;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
246 }
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
247
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
248
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
249 #ifdef SELECT_USES_HEAP
8616
2417f17fa3e5 On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents: 8570
diff changeset
250 /* Allocate memory for the lists */
19328
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
251 rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
252 wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
b41638a11e4e Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents: 19311
diff changeset
253 efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
8616
2417f17fa3e5 On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents: 8570
diff changeset
254 if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
255 if (rfd2obj) PyMem_DEL(rfd2obj);
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
256 if (wfd2obj) PyMem_DEL(wfd2obj);
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
257 if (efd2obj) PyMem_DEL(efd2obj);
27815
cb1eeaeb74a0 SF bug 684667: Modules/selectmodule.c returns NULL without exception set.
Tim Peters <tim.peters@gmail.com>
parents: 26270
diff changeset
258 return PyErr_NoMemory();
8616
2417f17fa3e5 On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents: 8570
diff changeset
259 }
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
260 #endif /* SELECT_USES_HEAP */
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
261 /* Convert sequences to fd_sets, and get maximum fd number
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
262 * propagates the Python exception set in seq2set()
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
263 */
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
264 rfd2obj[0].sentinel = -1;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
265 wfd2obj[0].sentinel = -1;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
266 efd2obj[0].sentinel = -1;
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
267 if ((imax=seq2set(ifdlist, &ifdset, rfd2obj)) < 0)
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
268 goto finally;
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
269 if ((omax=seq2set(ofdlist, &ofdset, wfd2obj)) < 0)
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
270 goto finally;
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
271 if ((emax=seq2set(efdlist, &efdset, efd2obj)) < 0)
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
272 goto finally;
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
273 max = imax;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
274 if (omax > max) max = omax;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
275 if (emax > max) max = emax;
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
276
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
277 Py_BEGIN_ALLOW_THREADS
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
278 n = select(max, &ifdset, &ofdset, &efdset, tvp);
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
279 Py_END_ALLOW_THREADS
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
280
25399
97424b99df91 On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents: 24408
diff changeset
281 #ifdef MS_WINDOWS
97424b99df91 On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents: 24408
diff changeset
282 if (n == SOCKET_ERROR) {
97424b99df91 On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents: 24408
diff changeset
283 PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError());
97424b99df91 On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents: 24408
diff changeset
284 }
97424b99df91 On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents: 24408
diff changeset
285 #else
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
286 if (n < 0) {
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
287 PyErr_SetFromErrno(SelectError);
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
288 }
25399
97424b99df91 On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents: 24408
diff changeset
289 #endif
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
290 else if (n == 0) {
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
291 /* optimization */
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
292 ifdlist = PyList_New(0);
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
293 if (ifdlist) {
30683
3b59fa5d25b1 Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents: 30402
diff changeset
294 ret = PyTuple_Pack(3, ifdlist, ifdlist, ifdlist);
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
295 Py_DECREF(ifdlist);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
296 }
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
297 }
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
298 else {
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
299 /* any of these three calls can raise an exception. it's more
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
300 convenient to test for this after all three calls... but
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
301 is that acceptable?
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
302 */
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
303 ifdlist = set2list(&ifdset, rfd2obj);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
304 ofdlist = set2list(&ofdset, wfd2obj);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
305 efdlist = set2list(&efdset, efd2obj);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
306 if (PyErr_Occurred())
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
307 ret = NULL;
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
308 else
30683
3b59fa5d25b1 Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents: 30402
diff changeset
309 ret = PyTuple_Pack(3, ifdlist, ofdlist, efdlist);
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
310
4700
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
311 Py_DECREF(ifdlist);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
312 Py_DECREF(ofdlist);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
313 Py_DECREF(efdlist);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
314 }
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
315
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
316 finally:
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
317 reap_obj(rfd2obj);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
318 reap_obj(wfd2obj);
825038d98ab6 Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents: 4692
diff changeset
319 reap_obj(efd2obj);
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
320 #ifdef SELECT_USES_HEAP
8616
2417f17fa3e5 On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents: 8570
diff changeset
321 PyMem_DEL(rfd2obj);
2417f17fa3e5 On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents: 8570
diff changeset
322 PyMem_DEL(wfd2obj);
2417f17fa3e5 On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents: 8570
diff changeset
323 PyMem_DEL(efd2obj);
19310
6cb9f538dce4 select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents: 18754
diff changeset
324 #endif /* SELECT_USES_HEAP */
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
325 return ret;
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 }
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
327
31761
f4a4ac7331ec Added configure check for broken poll() on some unix systems (MacOS X 10.3)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 30683
diff changeset
328 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
329 /*
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
330 * poll() support
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
331 */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
332
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
333 typedef struct {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
334 PyObject_HEAD
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
335 PyObject *dict;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
336 int ufd_uptodate;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
337 int ufd_len;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
338 struct pollfd *ufds;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
339 } pollObject;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
340
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23832
diff changeset
341 static PyTypeObject poll_Type;
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
342
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
343 /* Update the malloc'ed array of pollfds to match the dictionary
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
344 contained within a pollObject. Return 1 on success, 0 on an error.
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
345 */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
346
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
347 static int
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
348 update_ufd_array(pollObject *self)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
349 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
350 Py_ssize_t i, pos;
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
351 PyObject *key, *value;
48090
2da42dcbb8ce Backport code from r65182:
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
352 struct pollfd *old_ufds = self->ufds;
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
353
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
354 self->ufd_len = PyDict_Size(self->dict);
48090
2da42dcbb8ce Backport code from r65182:
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
355 PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len);
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
356 if (self->ufds == NULL) {
48090
2da42dcbb8ce Backport code from r65182:
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
357 self->ufds = old_ufds;
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
358 PyErr_NoMemory();
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
359 return 0;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
360 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
361
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
362 i = pos = 0;
18754
3cd03a64c338 Make more warnings go away on the SGI compiler.
Fred Drake <fdrake@acm.org>
parents: 18603
diff changeset
363 while (PyDict_Next(self->dict, &pos, &key, &value)) {
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
364 self->ufds[i].fd = PyInt_AsLong(key);
18754
3cd03a64c338 Make more warnings go away on the SGI compiler.
Fred Drake <fdrake@acm.org>
parents: 18603
diff changeset
365 self->ufds[i].events = (short)PyInt_AsLong(value);
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
366 i++;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
367 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
368 self->ufd_uptodate = 1;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
369 return 1;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
370 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
371
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
372 PyDoc_STRVAR(poll_register_doc,
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
373 "register(fd [, eventmask] ) -> None\n\n\
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
374 Register a file descriptor with the polling object.\n\
19311
fc7617312182 Fixed a couple of minor formatting nits where lines were > 79 columns wide.
Barry Warsaw <barry@python.org>
parents: 19310
diff changeset
375 fd -- either an integer, or an object with a fileno() method returning an\n\
fc7617312182 Fixed a couple of minor formatting nits where lines were > 79 columns wide.
Barry Warsaw <barry@python.org>
parents: 19310
diff changeset
376 int.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
377 events -- an optional bitmask describing the type of events to check for");
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
378
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
379 static PyObject *
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
380 poll_register(pollObject *self, PyObject *args)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
381 {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
382 PyObject *o, *key, *value;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
383 int fd, events = POLLIN | POLLPRI | POLLOUT;
20668
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
384 int err;
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
385
17873
1eb12259feea Add :method info to the PyArg_ParseTuple() format strings for poll objects.
Fred Drake <fdrake@acm.org>
parents: 16946
diff changeset
386 if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
387 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
388 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
389
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
390 fd = PyObject_AsFileDescriptor(o);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
391 if (fd == -1) return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
392
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
393 /* Add entry to the internal dictionary: the key is the
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
394 file descriptor, and the value is the event mask. */
20668
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
395 key = PyInt_FromLong(fd);
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
396 if (key == NULL)
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
397 return NULL;
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
398 value = PyInt_FromLong(events);
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
399 if (value == NULL) {
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
400 Py_DECREF(key);
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
401 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
402 }
20668
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
403 err = PyDict_SetItem(self->dict, key, value);
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
404 Py_DECREF(key);
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
405 Py_DECREF(value);
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
406 if (err < 0)
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
407 return NULL;
3e9b85de447b Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents: 20654
diff changeset
408
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
409 self->ufd_uptodate = 0;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
410
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
411 Py_INCREF(Py_None);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
412 return Py_None;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
413 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
414
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
415 PyDoc_STRVAR(poll_unregister_doc,
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
416 "unregister(fd) -> None\n\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
417 Remove a file descriptor being tracked by the polling object.");
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
418
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
419 static PyObject *
38489
3fe3ccdf0155 Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents: 37935
diff changeset
420 poll_unregister(pollObject *self, PyObject *o)
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
421 {
38489
3fe3ccdf0155 Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents: 37935
diff changeset
422 PyObject *key;
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
423 int fd;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
424
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
425 fd = PyObject_AsFileDescriptor( o );
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
426 if (fd == -1)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
427 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
428
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
429 /* Check whether the fd is already in the array */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
430 key = PyInt_FromLong(fd);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
431 if (key == NULL)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
432 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
433
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
434 if (PyDict_DelItem(self->dict, key) == -1) {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
435 Py_DECREF(key);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
436 /* This will simply raise the KeyError set by PyDict_DelItem
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
437 if the file descriptor isn't registered. */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
438 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
439 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
440
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
441 Py_DECREF(key);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
442 self->ufd_uptodate = 0;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
443
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
444 Py_INCREF(Py_None);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
445 return Py_None;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
446 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
447
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
448 PyDoc_STRVAR(poll_poll_doc,
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
449 "poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
450 Polls the set of registered file descriptors, returning a list containing \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
451 any descriptors that have events or errors to report.");
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
452
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
453 static PyObject *
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
454 poll_poll(pollObject *self, PyObject *args)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
455 {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
456 PyObject *result_list = NULL, *tout = NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
457 int timeout = 0, poll_result, i, j;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
458 PyObject *value = NULL, *num = NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
459
38489
3fe3ccdf0155 Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents: 37935
diff changeset
460 if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
461 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
462 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
463
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
464 /* Check values for timeout */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
465 if (tout == NULL || tout == Py_None)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
466 timeout = -1;
24408
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
467 else if (!PyNumber_Check(tout)) {
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
468 PyErr_SetString(PyExc_TypeError,
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
469 "timeout must be an integer or None");
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
470 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
471 }
24408
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
472 else {
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
473 tout = PyNumber_Int(tout);
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
474 if (!tout)
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
475 return NULL;
26153
6078abc69036 Use PyInt_AsLong instead of PyInt_AS_LONG after the call to
Walter Dörwald <walter@livinglogic.de>
parents: 25400
diff changeset
476 timeout = PyInt_AsLong(tout);
24408
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
477 Py_DECREF(tout);
35834
418a61ead11b Bug #1346533, select.poll() doesn't raise an error if timeout > sys.maxint
Neal Norwitz <nnorwitz@gmail.com>
parents: 33007
diff changeset
478 if (timeout == -1 && PyErr_Occurred())
418a61ead11b Bug #1346533, select.poll() doesn't raise an error if timeout > sys.maxint
Neal Norwitz <nnorwitz@gmail.com>
parents: 33007
diff changeset
479 return NULL;
24408
4de5c7e6231e SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
480 }
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
481
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
482 /* Ensure the ufd array is up to date */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
483 if (!self->ufd_uptodate)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
484 if (update_ufd_array(self) == 0)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
485 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
486
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
487 /* call poll() */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
488 Py_BEGIN_ALLOW_THREADS;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
489 poll_result = poll(self->ufds, self->ufd_len, timeout);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
490 Py_END_ALLOW_THREADS;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
491
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
492 if (poll_result < 0) {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
493 PyErr_SetFromErrno(SelectError);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
494 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
495 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
496
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
497 /* build the result list */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
498
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
499 result_list = PyList_New(poll_result);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
500 if (!result_list)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
501 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
502 else {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
503 for (i = 0, j = 0; j < poll_result; j++) {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
504 /* skip to the next fired descriptor */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
505 while (!self->ufds[i].revents) {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
506 i++;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
507 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
508 /* if we hit a NULL return, set value to NULL
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
509 and break out of loop; code at end will
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
510 clean up result_list */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
511 value = PyTuple_New(2);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
512 if (value == NULL)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
513 goto error;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
514 num = PyInt_FromLong(self->ufds[i].fd);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
515 if (num == NULL) {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
516 Py_DECREF(value);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
517 goto error;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
518 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
519 PyTuple_SET_ITEM(value, 0, num);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
520
33007
9fb2e30f26be [Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents: 31761
diff changeset
521 /* The &0xffff is a workaround for AIX. 'revents'
9fb2e30f26be [Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents: 31761
diff changeset
522 is a 16-bit short, and IBM assigned POLLNVAL
9fb2e30f26be [Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents: 31761
diff changeset
523 to be 0x8000, so the conversion to int results
9fb2e30f26be [Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents: 31761
diff changeset
524 in a negative number. See SF bug #923315. */
9fb2e30f26be [Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents: 31761
diff changeset
525 num = PyInt_FromLong(self->ufds[i].revents & 0xffff);
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
526 if (num == NULL) {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
527 Py_DECREF(value);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
528 goto error;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
529 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
530 PyTuple_SET_ITEM(value, 1, num);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
531 if ((PyList_SetItem(result_list, j, value)) == -1) {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
532 Py_DECREF(value);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
533 goto error;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
534 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
535 i++;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
536 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
537 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
538 return result_list;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
539
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
540 error:
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
541 Py_DECREF(result_list);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
542 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
543 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
544
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
545 static PyMethodDef poll_methods[] = {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
546 {"register", (PyCFunction)poll_register,
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
547 METH_VARARGS, poll_register_doc},
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
548 {"unregister", (PyCFunction)poll_unregister,
38489
3fe3ccdf0155 Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents: 37935
diff changeset
549 METH_O, poll_unregister_doc},
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
550 {"poll", (PyCFunction)poll_poll,
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
551 METH_VARARGS, poll_poll_doc},
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
552 {NULL, NULL} /* sentinel */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
553 };
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
554
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
555 static pollObject *
14277
984abd20eec2 Peter Schneider-Kamp <nowonder@nowonder.de>:
Fred Drake <fdrake@acm.org>
parents: 14182
diff changeset
556 newPollObject(void)
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
557 {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
558 pollObject *self;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
559 self = PyObject_New(pollObject, &poll_Type);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
560 if (self == NULL)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
561 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
562 /* ufd_uptodate is a Boolean, denoting whether the
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
563 array pointed to by ufds matches the contents of the dictionary. */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
564 self->ufd_uptodate = 0;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
565 self->ufds = NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
566 self->dict = PyDict_New();
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
567 if (self->dict == NULL) {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
568 Py_DECREF(self);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
569 return NULL;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
570 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
571 return self;
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
572 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
573
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
574 static void
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
575 poll_dealloc(pollObject *self)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
576 {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
577 if (self->ufds != NULL)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
578 PyMem_DEL(self->ufds);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
579 Py_XDECREF(self->dict);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
580 PyObject_Del(self);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
581 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
582
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
583 static PyObject *
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
584 poll_getattr(pollObject *self, char *name)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
585 {
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
586 return Py_FindMethod(poll_methods, (PyObject *)self, name);
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
587 }
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
588
24283
c0a67a1cab09 Removed more stray instances of statichere, but left _sre.c alone.
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
589 static PyTypeObject poll_Type = {
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
590 /* The ob_type field must be initialized in the module init function
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
591 * to be portable to Windows without using C++. */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
592 PyObject_HEAD_INIT(NULL)
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
593 0, /*ob_size*/
21313
91dd223829c6 Patch supplied by Burton Radons for his own SF bug #487390: Modifying
Guido van Rossum <guido@python.org>
parents: 20668
diff changeset
594 "select.poll", /*tp_name*/
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
595 sizeof(pollObject), /*tp_basicsize*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
596 0, /*tp_itemsize*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
597 /* methods */
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
598 (destructor)poll_dealloc, /*tp_dealloc*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
599 0, /*tp_print*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
600 (getattrfunc)poll_getattr, /*tp_getattr*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
601 0, /*tp_setattr*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
602 0, /*tp_compare*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
603 0, /*tp_repr*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
604 0, /*tp_as_number*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
605 0, /*tp_as_sequence*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
606 0, /*tp_as_mapping*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
607 0, /*tp_hash*/
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
608 };
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
609
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
610 PyDoc_STRVAR(poll_doc,
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
611 "Returns a polling object, which supports registering and\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
612 unregistering file descriptors, and then polling them for I/O events.");
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
613
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
614 static PyObject *
38489
3fe3ccdf0155 Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents: 37935
diff changeset
615 select_poll(PyObject *self, PyObject *unused)
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
616 {
38489
3fe3ccdf0155 Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents: 37935
diff changeset
617 return (PyObject *)newPollObject();
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
618 }
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
619
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
620 #ifdef __APPLE__
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
621 /*
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
622 * On some systems poll() sets errno on invalid file descriptors. We test
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
623 * for this at runtime because this bug may be fixed or introduced between
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
624 * OS releases.
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
625 */
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
626 static int select_have_broken_poll(void)
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
627 {
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
628 int poll_test;
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
629 int filedes[2];
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
630
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
631 struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 };
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
632
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
633 /* Create a file descriptor to make invalid */
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
634 if (pipe(filedes) < 0) {
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
635 return 1;
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
636 }
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
637 poll_struct.fd = filedes[0];
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
638 close(filedes[0]);
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
639 close(filedes[1]);
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
640 poll_test = poll(&poll_struct, 1, 0);
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
641 if (poll_test < 0) {
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
642 return 1;
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
643 } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) {
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
644 return 1;
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
645 }
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
646 return 0;
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
647 }
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
648 #endif /* __APPLE__ */
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
649
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
650 #endif /* HAVE_POLL */
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
651
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
652 PyDoc_STRVAR(select_doc,
8570
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
653 "select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
654 \n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
655 Wait until one or more file descriptors are ready for some kind of I/O.\n\
30402
a430be683a7a select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents: 27815
diff changeset
656 The first three arguments are sequences of file descriptors to be waited for:\n\
8570
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
657 rlist -- wait until ready for reading\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
658 wlist -- wait until ready for writing\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
659 xlist -- wait for an ``exceptional condition''\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
660 If only one kind of condition is required, pass [] for the other lists.\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
661 A file descriptor is either a socket or file object, or a small integer\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
662 gotten from a fileno() method call on one of those.\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
663 \n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
664 The optional 4th argument specifies a timeout in seconds; it may be\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
665 a floating point number to specify fractions of seconds. If it is absent\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
666 or None, the call will never time out.\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
667 \n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
668 The return value is a tuple of three lists corresponding to the first three\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
669 arguments; each contains the subset of the corresponding file descriptors\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
670 that are ready.\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
671 \n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
672 *** IMPORTANT NOTICE ***\n\
39043
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
673 On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.");
8570
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
674
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
675 static PyMethodDef select_methods[] = {
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
676 {"select", select_select, METH_VARARGS, select_doc},
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
677 #if defined(HAVE_POLL)
38489
3fe3ccdf0155 Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents: 37935
diff changeset
678 {"poll", select_poll, METH_NOARGS, poll_doc},
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
679 #endif /* HAVE_POLL */
4692
cb405b9696d4 Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents: 4621
diff changeset
680 {0, 0}, /* sentinel */
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
681 };
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
682
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23607
diff changeset
683 PyDoc_STRVAR(module_doc,
8570
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
684 "This module supports asynchronous I/O on multiple file descriptors.\n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
685 \n\
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
686 *** IMPORTANT NOTICE ***\n\
39043
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38716
diff changeset
687 On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.");
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
688
24363
979ff5d0ae07 Replace DL_IMPORT with PyMODINIT_FUNC and remove "/export:init..." link
Mark Hammond <mhammond@skippinet.com.au>
parents: 24283
diff changeset
689 PyMODINIT_FUNC
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13593
diff changeset
690 initselect(void)
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
691 {
22729
cdff3c7c1a76 Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents: 22114
diff changeset
692 PyObject *m;
8570
bd695de18ecf Added doc strings.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
693 m = Py_InitModule3("select", select_methods, module_doc);
36324
1af7f719ed28 Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35834
diff changeset
694 if (m == NULL)
1af7f719ed28 Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35834
diff changeset
695 return;
22729
cdff3c7c1a76 Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents: 22114
diff changeset
696
6367
2c29b8982643 Apply two changes, systematically:
Guido van Rossum <guido@python.org>
parents: 4734
diff changeset
697 SelectError = PyErr_NewException("select.error", NULL, NULL);
22729
cdff3c7c1a76 Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents: 22114
diff changeset
698 Py_INCREF(SelectError);
cdff3c7c1a76 Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents: 22114
diff changeset
699 PyModule_AddObject(m, "error", SelectError);
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
700 #if defined(HAVE_POLL)
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
701
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
702 #ifdef __APPLE__
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
703 if (select_have_broken_poll()) {
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
704 if (PyObject_DelAttrString(m, "poll") == -1) {
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
705 PyErr_Clear();
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
706 }
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
707 } else {
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
708 #else
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
709 {
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
710 #endif
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
711 poll_Type.ob_type = &PyType_Type;
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
712 PyModule_AddIntConstant(m, "POLLIN", POLLIN);
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
713 PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
714 PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
715 PyModule_AddIntConstant(m, "POLLERR", POLLERR);
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
716 PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
717 PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
14174
35b7989ba20c Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents: 13761
diff changeset
718
14918
914ae7f9c64c Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents: 14869
diff changeset
719 #ifdef POLLRDNORM
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
720 PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
14918
914ae7f9c64c Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents: 14869
diff changeset
721 #endif
914ae7f9c64c Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents: 14869
diff changeset
722 #ifdef POLLRDBAND
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
723 PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
14918
914ae7f9c64c Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents: 14869
diff changeset
724 #endif
914ae7f9c64c Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents: 14869
diff changeset
725 #ifdef POLLWRNORM
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
726 PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
14918
914ae7f9c64c Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents: 14869
diff changeset
727 #endif
914ae7f9c64c Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents: 14869
diff changeset
728 #ifdef POLLWRBAND
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
729 PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
14918
914ae7f9c64c Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents: 14869
diff changeset
730 #endif
14182
c85a80db6845 Not every OS that support poll seems to support POLLMSG.
Sjoerd Mullender <sjoerd@acm.org>
parents: 14174
diff changeset
731 #ifdef POLLMSG
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
732 PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
14182
c85a80db6845 Not every OS that support poll seems to support POLLMSG.
Sjoerd Mullender <sjoerd@acm.org>
parents: 14174
diff changeset
733 #endif
37935
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
734 }
e3a8a8de355e Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 36501
diff changeset
735 #endif /* HAVE_POLL */
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff changeset
736 }