Mercurial > cpython-lru_cache-weakref
annotate Modules/selectmodule.c @ 25838:8540887bcec6 2.2
Backport of 2.183:
Fix memory leak in add_subclass() found by NealN with valgrind.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Fri, 18 Oct 2002 13:42:21 +0000 |
| parents | 51cdf470f974 |
| children | faffb11f54e8 |
| 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 |
|
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
|
11 /* 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
|
12 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
|
13 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
|
14 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
|
15 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
|
16 */ |
|
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
|
17 #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
|
18 #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
|
19 #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
|
20 |
| 18603 | 21 #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
|
22 #include <poll.h> |
| 18603 | 23 #elif defined(HAVE_SYS_POLL_H) |
| 24 #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
|
25 #endif |
| 4600 | 26 |
|
4621
a2f171ce25f8
Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4600
diff
changeset
|
27 #ifdef __sgi |
|
a2f171ce25f8
Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4600
diff
changeset
|
28 /* 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
|
29 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
|
30 #endif |
|
a2f171ce25f8
Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4600
diff
changeset
|
31 |
|
11243
6aac31cd2102
Patch by Mark Hammond to avoid certain header files on Windows/CE.
Guido van Rossum <guido@python.org>
parents:
9588
diff
changeset
|
32 #ifndef DONT_HAVE_SYS_TYPES_H |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1392
diff
changeset
|
33 #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
|
34 #endif |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
35 |
|
6626
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
36 #if defined(PYOS_OS2) |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
37 #include <sys/time.h> |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
38 #include <utils.h> |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
39 #endif |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
40 |
|
3738
ce74bba8a6a6
Slightly different Windows ifdefs
Guido van Rossum <guido@python.org>
parents:
3675
diff
changeset
|
41 #ifdef MS_WINDOWS |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
42 #include <winsock.h> |
|
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
43 #else |
|
8823
f2a4a2b60860
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8616
diff
changeset
|
44 #ifdef __BEOS__ |
|
f2a4a2b60860
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8616
diff
changeset
|
45 #include <net/socket.h> |
|
f2a4a2b60860
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8616
diff
changeset
|
46 #define SOCKET int |
|
f2a4a2b60860
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8616
diff
changeset
|
47 #else |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
48 #define SOCKET int |
|
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
49 #endif |
|
8823
f2a4a2b60860
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8616
diff
changeset
|
50 #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
|
51 |
|
16946
31e302e94da8
RISCOS changes by dschwertberger
Guido van Rossum <guido@python.org>
parents:
15512
diff
changeset
|
52 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
53 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
|
54 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
55 /* 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
|
56 typedef struct { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
57 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
|
58 SOCKET fd; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
59 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
|
60 } pylist; |
|
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
61 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
62 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
|
63 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
|
64 { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
65 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
|
66 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
|
67 Py_XDECREF(fd2obj[i].obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
68 fd2obj[i].obj = NULL; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
69 } |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
70 fd2obj[0].sentinel = -1; |
|
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 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
73 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
74 /* 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
|
75 returns a number >= 0 |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
76 */ |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
77 static int |
|
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
|
78 list2set(PyObject *list, 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
|
79 { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
80 int i; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
81 int max = -1; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
82 int index = 0; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
83 int len = PyList_Size(list); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
84 PyObject* o = NULL; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
85 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
86 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
|
87 FD_ZERO(set); |
| 2611 | 88 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
89 for (i = 0; i < len; i++) { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
90 SOCKET v; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
91 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
92 /* any intervening fileno() calls could decr this refcnt */ |
|
4730
62cf7d589300
list2set(): PyList_GetItem could fail.
Barry Warsaw <barry@python.org>
parents:
4700
diff
changeset
|
93 if (!(o = PyList_GetItem(list, i))) |
|
4734
3db423515626
list2set(): correct return value (an int, not a PyObject*).
Barry Warsaw <barry@python.org>
parents:
4730
diff
changeset
|
94 return -1; |
|
4730
62cf7d589300
list2set(): PyList_GetItem could fail.
Barry Warsaw <barry@python.org>
parents:
4700
diff
changeset
|
95 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
96 Py_INCREF(o); |
|
13593
df64cc0e84e2
Use PyObject_AsFileDescriptor
Andrew M. Kuchling <amk@amk.ca>
parents:
13550
diff
changeset
|
97 v = PyObject_AsFileDescriptor( o ); |
|
df64cc0e84e2
Use PyObject_AsFileDescriptor
Andrew M. Kuchling <amk@amk.ca>
parents:
13550
diff
changeset
|
98 if (v == -1) goto finally; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
99 |
|
11656
db756d31e727
According to Ron Bickers, and with apparent approval of Chris
Guido van Rossum <guido@python.org>
parents:
11243
diff
changeset
|
100 #if defined(_MSC_VER) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
101 max = 0; /* not used for Win32 */ |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
102 #else /* !_MSC_VER */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
103 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
|
104 PyErr_SetString(PyExc_ValueError, |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
105 "filedescriptor out of range in select()"); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
106 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
107 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
108 if (v > max) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
109 max = v; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
110 #endif /* _MSC_VER */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
111 FD_SET(v, set); |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
112 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
113 /* 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
|
114 if (index >= FD_SETSIZE) { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
115 PyErr_SetString(PyExc_ValueError, |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
116 "too many file descriptors in select()"); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
117 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
118 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
119 fd2obj[index].obj = o; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
120 fd2obj[index].fd = v; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
121 fd2obj[index].sentinel = 0; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
122 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
|
123 } |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
124 return max+1; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
125 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
126 finally: |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
127 Py_XDECREF(o); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
128 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
|
129 } |
|
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
130 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
131 /* 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
|
132 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
|
133 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
|
134 { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
135 int i, j, count=0; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
136 PyObject *list, *o; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
137 SOCKET fd; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
138 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
139 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
|
140 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
|
141 count++; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
142 } |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
143 list = PyList_New(count); |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
144 if (!list) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
145 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
|
146 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
147 i = 0; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
148 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
|
149 fd = fd2obj[j].fd; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
150 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
|
151 #ifndef _MSC_VER |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
152 if (fd > FD_SETSIZE) { |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
153 PyErr_SetString(PyExc_SystemError, |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
154 "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
|
155 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
156 } |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
157 #endif |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
158 o = fd2obj[j].obj; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
159 fd2obj[j].obj = NULL; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
160 /* transfer ownership */ |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
161 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
|
162 goto finally; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
163 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
164 i++; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
165 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
166 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
167 return list; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
168 finally: |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
169 Py_DECREF(list); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
170 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
|
171 } |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
172 |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
173 #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
|
174 #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
|
175 #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
|
176 #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
|
177 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
178 static PyObject * |
|
13502
7348cceee8fa
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13256
diff
changeset
|
179 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
|
180 { |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
181 #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
|
182 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
|
183 #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
|
184 /* 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
|
185 * - 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
|
186 * - add one |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
187 * - 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
|
188 * 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
|
189 */ |
|
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
|
190 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
|
191 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
|
192 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
|
193 #endif /* SELECT_USES_HEAP */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
194 PyObject *ifdlist, *ofdlist, *efdlist; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
195 PyObject *ret = NULL; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
196 PyObject *tout = Py_None; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
197 fd_set ifdset, ofdset, efdset; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
198 double timeout; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
199 struct timeval tv, *tvp; |
| 13079 | 200 long seconds; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
201 int imax, omax, emax, max; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
202 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
|
203 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
204 /* convert arguments */ |
|
11882
dc65c5f6ad7c
Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents:
11656
diff
changeset
|
205 if (!PyArg_ParseTuple(args, "OOO|O:select", |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
206 &ifdlist, &ofdlist, &efdlist, &tout)) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
207 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
|
208 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
209 if (tout == Py_None) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
210 tvp = (struct timeval *)0; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
211 else if (!PyArg_Parse(tout, "d", &timeout)) { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
212 PyErr_SetString(PyExc_TypeError, |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
213 "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
|
214 return NULL; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
215 } |
|
1390
cffe8d6b2f09
* selectmodule.c (select_select): timeout argument may be None with same
Guido van Rossum <guido@python.org>
parents:
1284
diff
changeset
|
216 else { |
| 13079 | 217 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
|
218 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
|
219 "timeout period too long"); |
| 13079 | 220 return NULL; |
| 221 } | |
| 222 seconds = (long)timeout; | |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
223 timeout = timeout - (double)seconds; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
224 tv.tv_sec = seconds; |
| 13079 | 225 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
|
226 tvp = &tv; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
227 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
228 |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
229 /* sanity check first three arguments */ |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
230 if (!PyList_Check(ifdlist) || |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
231 !PyList_Check(ofdlist) || |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
232 !PyList_Check(efdlist)) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
233 { |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
234 PyErr_SetString(PyExc_TypeError, |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
235 "arguments 1-3 must be lists"); |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
236 return NULL; |
|
1390
cffe8d6b2f09
* selectmodule.c (select_select): timeout argument may be None with same
Guido van Rossum <guido@python.org>
parents:
1284
diff
changeset
|
237 } |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
238 |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
239 #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
|
240 /* 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
|
241 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
|
242 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
|
243 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
|
244 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
|
245 if (rfd2obj) PyMem_DEL(rfd2obj); |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
246 if (wfd2obj) PyMem_DEL(wfd2obj); |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
247 if (efd2obj) PyMem_DEL(efd2obj); |
|
8616
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
248 return NULL; |
|
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
249 } |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
250 #endif /* SELECT_USES_HEAP */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
251 /* Convert lists to fd_sets, and get maximum fd number |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
252 * propagates the Python exception set in list2set() |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
253 */ |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
254 rfd2obj[0].sentinel = -1; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
255 wfd2obj[0].sentinel = -1; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
256 efd2obj[0].sentinel = -1; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
257 if ((imax=list2set(ifdlist, &ifdset, rfd2obj)) < 0) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
258 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
259 if ((omax=list2set(ofdlist, &ofdset, wfd2obj)) < 0) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
260 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
261 if ((emax=list2set(efdlist, &efdset, efd2obj)) < 0) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
262 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
263 max = imax; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
264 if (omax > max) max = omax; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
265 if (emax > max) max = emax; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
266 |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
267 Py_BEGIN_ALLOW_THREADS |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
268 n = select(max, &ifdset, &ofdset, &efdset, tvp); |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
269 Py_END_ALLOW_THREADS |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
270 |
|
25403
51cdf470f974
backport of the checkin of revision 2.69 of selectmodule.c
Thomas Heller <theller@ctypes.org>
parents:
21713
diff
changeset
|
271 #ifdef MS_WINDOWS |
|
51cdf470f974
backport of the checkin of revision 2.69 of selectmodule.c
Thomas Heller <theller@ctypes.org>
parents:
21713
diff
changeset
|
272 if (n == SOCKET_ERROR) { |
|
51cdf470f974
backport of the checkin of revision 2.69 of selectmodule.c
Thomas Heller <theller@ctypes.org>
parents:
21713
diff
changeset
|
273 errno = WSAGetLastError(); |
|
51cdf470f974
backport of the checkin of revision 2.69 of selectmodule.c
Thomas Heller <theller@ctypes.org>
parents:
21713
diff
changeset
|
274 PyErr_SetFromErrno(SelectError); |
|
51cdf470f974
backport of the checkin of revision 2.69 of selectmodule.c
Thomas Heller <theller@ctypes.org>
parents:
21713
diff
changeset
|
275 } |
|
51cdf470f974
backport of the checkin of revision 2.69 of selectmodule.c
Thomas Heller <theller@ctypes.org>
parents:
21713
diff
changeset
|
276 #else |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
277 if (n < 0) { |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
278 PyErr_SetFromErrno(SelectError); |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
279 } |
|
25403
51cdf470f974
backport of the checkin of revision 2.69 of selectmodule.c
Thomas Heller <theller@ctypes.org>
parents:
21713
diff
changeset
|
280 #endif |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
281 else if (n == 0) { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
282 /* optimization */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
283 ifdlist = PyList_New(0); |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
284 if (ifdlist) { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
285 ret = Py_BuildValue("OOO", ifdlist, ifdlist, ifdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
286 Py_DECREF(ifdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
287 } |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
288 } |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
289 else { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
290 /* 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
|
291 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
|
292 is that acceptable? |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
293 */ |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
294 ifdlist = set2list(&ifdset, rfd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
295 ofdlist = set2list(&ofdset, wfd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
296 efdlist = set2list(&efdset, efd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
297 if (PyErr_Occurred()) |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
298 ret = NULL; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
299 else |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
300 ret = Py_BuildValue("OOO", 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
|
301 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
302 Py_DECREF(ifdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
303 Py_DECREF(ofdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
304 Py_DECREF(efdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
305 } |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
306 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
307 finally: |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
308 reap_obj(rfd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
309 reap_obj(wfd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
310 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
|
311 #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
|
312 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
|
313 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
|
314 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
|
315 #endif /* SELECT_USES_HEAP */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
316 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
|
317 } |
|
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
319 #ifdef HAVE_POLL |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
320 /* |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
321 * poll() support |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
322 */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
323 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
324 typedef struct { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
325 PyObject_HEAD |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
326 PyObject *dict; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
327 int ufd_uptodate; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
328 int ufd_len; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
329 struct pollfd *ufds; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
330 } pollObject; |
|
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 staticforward PyTypeObject poll_Type; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
333 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
334 /* 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
|
335 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
|
336 */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
337 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
338 static int |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
339 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
|
340 { |
|
18754
3cd03a64c338
Make more warnings go away on the SGI compiler.
Fred Drake <fdrake@acm.org>
parents:
18603
diff
changeset
|
341 int i, pos; |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
342 PyObject *key, *value; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
343 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
344 self->ufd_len = PyDict_Size(self->dict); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
345 PyMem_Resize(self->ufds, struct pollfd, self->ufd_len); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
346 if (self->ufds == NULL) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
347 PyErr_NoMemory(); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
348 return 0; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
349 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
350 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
351 i = pos = 0; |
|
18754
3cd03a64c338
Make more warnings go away on the SGI compiler.
Fred Drake <fdrake@acm.org>
parents:
18603
diff
changeset
|
352 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
|
353 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
|
354 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
|
355 i++; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
356 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
357 self->ufd_uptodate = 1; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
358 return 1; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
359 } |
|
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 static char poll_register_doc[] = |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
362 "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
|
363 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
|
364 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
|
365 int.\n\ |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
366 events -- an optional bitmask describing the type of events to check for"; |
|
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 static PyObject * |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
369 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
|
370 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
371 PyObject *o, *key, *value; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
372 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
|
373 int err; |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
374 |
|
17873
1eb12259feea
Add :method info to the PyArg_ParseTuple() format strings for poll objects.
Fred Drake <fdrake@acm.org>
parents:
16946
diff
changeset
|
375 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
|
376 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
377 } |
|
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 fd = PyObject_AsFileDescriptor(o); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
380 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
|
381 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
382 /* 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
|
383 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
|
384 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
|
385 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
|
386 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
|
387 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
|
388 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
|
389 Py_DECREF(key); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
390 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
391 } |
|
20668
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
392 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
|
393 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
|
394 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
|
395 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
|
396 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
|
397 |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
398 self->ufd_uptodate = 0; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
399 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
400 Py_INCREF(Py_None); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
401 return Py_None; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
402 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
403 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
404 static char poll_unregister_doc[] = |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
405 "unregister(fd) -> None\n\n\ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
406 Remove a file descriptor being tracked by the polling object."; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
407 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
408 static PyObject * |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
409 poll_unregister(pollObject *self, PyObject *args) |
|
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 PyObject *o, *key; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
412 int fd; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
413 |
|
17873
1eb12259feea
Add :method info to the PyArg_ParseTuple() format strings for poll objects.
Fred Drake <fdrake@acm.org>
parents:
16946
diff
changeset
|
414 if (!PyArg_ParseTuple(args, "O:unregister", &o)) { |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
415 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
416 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
417 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
418 fd = PyObject_AsFileDescriptor( o ); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
419 if (fd == -1) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
420 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
421 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
422 /* 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
|
423 key = PyInt_FromLong(fd); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
424 if (key == NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
425 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
426 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
427 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
|
428 Py_DECREF(key); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
429 /* 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
|
430 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
|
431 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
432 } |
|
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 Py_DECREF(key); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
435 self->ufd_uptodate = 0; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
436 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
437 Py_INCREF(Py_None); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
438 return Py_None; |
|
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 static char poll_poll_doc[] = |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
442 "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
|
443 Polls the set of registered file descriptors, returning a list containing \n\ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
444 any descriptors that have events or errors to report."; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
445 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
446 static PyObject * |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
447 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
|
448 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
449 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
|
450 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
|
451 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
|
452 |
|
17873
1eb12259feea
Add :method info to the PyArg_ParseTuple() format strings for poll objects.
Fred Drake <fdrake@acm.org>
parents:
16946
diff
changeset
|
453 if (!PyArg_ParseTuple(args, "|O:poll", &tout)) { |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
454 return NULL; |
|
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 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
457 /* Check values for timeout */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
458 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
|
459 timeout = -1; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
460 else if (!PyArg_Parse(tout, "i", &timeout)) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
461 PyErr_SetString(PyExc_TypeError, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
462 "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
|
463 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
464 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
465 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
466 /* 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
|
467 if (!self->ufd_uptodate) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
468 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
|
469 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
470 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
471 /* call poll() */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
472 Py_BEGIN_ALLOW_THREADS; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
473 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
|
474 Py_END_ALLOW_THREADS; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
475 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
476 if (poll_result < 0) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
477 PyErr_SetFromErrno(SelectError); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
478 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
479 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
480 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
481 /* build the result list */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
482 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
483 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
|
484 if (!result_list) |
|
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 else { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
487 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
|
488 /* 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
|
489 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
|
490 i++; |
|
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 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
|
493 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
|
494 clean up result_list */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
495 value = PyTuple_New(2); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
496 if (value == NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
497 goto error; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
498 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
|
499 if (num == NULL) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
500 Py_DECREF(value); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
501 goto error; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
502 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
503 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
|
504 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
505 num = PyInt_FromLong(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 if (num == NULL) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
507 Py_DECREF(value); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
508 goto error; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
509 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
510 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
|
511 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
|
512 Py_DECREF(value); |
|
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 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
515 i++; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
516 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
517 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
518 return result_list; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
519 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
520 error: |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
521 Py_DECREF(result_list); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
522 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
523 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
524 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
525 static PyMethodDef poll_methods[] = { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
526 {"register", (PyCFunction)poll_register, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
527 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
|
528 {"unregister", (PyCFunction)poll_unregister, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
529 METH_VARARGS, poll_unregister_doc}, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
530 {"poll", (PyCFunction)poll_poll, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
531 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
|
532 {NULL, NULL} /* sentinel */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
533 }; |
|
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 static pollObject * |
|
14277
984abd20eec2
Peter Schneider-Kamp <nowonder@nowonder.de>:
Fred Drake <fdrake@acm.org>
parents:
14182
diff
changeset
|
536 newPollObject(void) |
|
14174
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 pollObject *self; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
539 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
|
540 if (self == NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
541 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
542 /* 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
|
543 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
|
544 self->ufd_uptodate = 0; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
545 self->ufds = NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
546 self->dict = PyDict_New(); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
547 if (self->dict == NULL) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
548 Py_DECREF(self); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
549 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
550 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
551 return self; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
552 } |
|
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 static void |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
555 poll_dealloc(pollObject *self) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
556 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
557 if (self->ufds != NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
558 PyMem_DEL(self->ufds); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
559 Py_XDECREF(self->dict); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
560 PyObject_Del(self); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
561 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
562 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
563 static PyObject * |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
564 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
|
565 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
566 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
|
567 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
568 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
569 statichere PyTypeObject poll_Type = { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
570 /* 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
|
571 * 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
|
572 PyObject_HEAD_INIT(NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
573 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
|
574 "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
|
575 sizeof(pollObject), /*tp_basicsize*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
576 0, /*tp_itemsize*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
577 /* methods */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
578 (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
|
579 0, /*tp_print*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
580 (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
|
581 0, /*tp_setattr*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
582 0, /*tp_compare*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
583 0, /*tp_repr*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
584 0, /*tp_as_number*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
585 0, /*tp_as_sequence*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
586 0, /*tp_as_mapping*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
587 0, /*tp_hash*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
588 }; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
589 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
590 static char poll_doc[] = |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
591 "Returns a polling object, which supports registering and\n\ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
592 unregistering file descriptors, and then polling them for I/O events."; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
593 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
594 static PyObject * |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
595 select_poll(PyObject *self, PyObject *args) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
596 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
597 pollObject *rv; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
598 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
599 if (!PyArg_ParseTuple(args, ":poll")) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
600 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
601 rv = newPollObject(); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
602 if ( rv == NULL ) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
603 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
604 return (PyObject *)rv; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
605 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
606 #endif /* HAVE_POLL */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
607 |
| 8570 | 608 static char select_doc[] = |
| 609 "select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\ | |
| 610 \n\ | |
| 611 Wait until one or more file descriptors are ready for some kind of I/O.\n\ | |
| 612 The first three arguments are lists of file descriptors to be waited for:\n\ | |
| 613 rlist -- wait until ready for reading\n\ | |
| 614 wlist -- wait until ready for writing\n\ | |
| 615 xlist -- wait for an ``exceptional condition''\n\ | |
| 616 If only one kind of condition is required, pass [] for the other lists.\n\ | |
| 617 A file descriptor is either a socket or file object, or a small integer\n\ | |
| 618 gotten from a fileno() method call on one of those.\n\ | |
| 619 \n\ | |
| 620 The optional 4th argument specifies a timeout in seconds; it may be\n\ | |
| 621 a floating point number to specify fractions of seconds. If it is absent\n\ | |
| 622 or None, the call will never time out.\n\ | |
| 623 \n\ | |
| 624 The return value is a tuple of three lists corresponding to the first three\n\ | |
| 625 arguments; each contains the subset of the corresponding file descriptors\n\ | |
| 626 that are ready.\n\ | |
| 627 \n\ | |
| 628 *** IMPORTANT NOTICE ***\n\ | |
| 629 On Windows, only sockets are supported; on Unix, all file descriptors."; | |
| 630 | |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
631 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
|
632 {"select", select_select, METH_VARARGS, select_doc}, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
633 #ifdef HAVE_POLL |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
634 {"poll", select_poll, METH_VARARGS, poll_doc}, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
635 #endif /* HAVE_POLL */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
636 {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
|
637 }; |
|
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
638 |
| 8570 | 639 static char module_doc[] = |
| 640 "This module supports asynchronous I/O on multiple file descriptors.\n\ | |
| 641 \n\ | |
| 642 *** IMPORTANT NOTICE ***\n\ | |
| 643 On Windows, 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
|
644 |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
645 /* |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
646 * Convenience routine to export an integer value. |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
647 * For simplicity, errors (which are unlikely anyway) are ignored. |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
648 */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
649 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
650 static void |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
651 insint(PyObject *d, char *name, int value) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
652 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
653 PyObject *v = PyInt_FromLong((long) value); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
654 if (v == NULL) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
655 /* Don't bother reporting this error */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
656 PyErr_Clear(); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
657 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
658 else { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
659 PyDict_SetItemString(d, name, v); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
660 Py_DECREF(v); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
661 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
662 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
663 |
|
9588
38023a425e48
Add DL_EXPORT() to all modules that could possibly be used
Guido van Rossum <guido@python.org>
parents:
8823
diff
changeset
|
664 DL_EXPORT(void) |
|
13651
8a063423e0b7
Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents:
13593
diff
changeset
|
665 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
|
666 { |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
667 PyObject *m, *d; |
| 8570 | 668 m = Py_InitModule3("select", select_methods, module_doc); |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
669 d = PyModule_GetDict(m); |
|
6367
2c29b8982643
Apply two changes, systematically:
Guido van Rossum <guido@python.org>
parents:
4734
diff
changeset
|
670 SelectError = PyErr_NewException("select.error", NULL, NULL); |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
671 PyDict_SetItemString(d, "error", SelectError); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
672 #ifdef HAVE_POLL |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
673 poll_Type.ob_type = &PyType_Type; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
674 insint(d, "POLLIN", POLLIN); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
675 insint(d, "POLLPRI", POLLPRI); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
676 insint(d, "POLLOUT", POLLOUT); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
677 insint(d, "POLLERR", POLLERR); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
678 insint(d, "POLLHUP", POLLHUP); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
679 insint(d, "POLLNVAL", POLLNVAL); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
680 |
|
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
|
681 #ifdef POLLRDNORM |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
682 insint(d, "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
|
683 #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
|
684 #ifdef POLLRDBAND |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
685 insint(d, "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
|
686 #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
|
687 #ifdef POLLWRNORM |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
688 insint(d, "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
|
689 #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
|
690 #ifdef POLLWRBAND |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
691 insint(d, "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
|
692 #endif |
|
14182
c85a80db6845
Not every OS that support poll seems to support POLLMSG.
Sjoerd Mullender <sjoerd@acm.org>
parents:
14174
diff
changeset
|
693 #ifdef POLLMSG |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
694 insint(d, "POLLMSG", POLLMSG); |
|
14182
c85a80db6845
Not every OS that support poll seems to support POLLMSG.
Sjoerd Mullender <sjoerd@acm.org>
parents:
14174
diff
changeset
|
695 #endif |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
696 #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
|
697 } |
