Mercurial > cpython-lru_cache-weakref
annotate Modules/selectmodule.c @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | 50b1e55756a5 |
| children | 97d7cd365dd5 9c9fe9aafba6 |
| 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" |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
10 #include <structmember.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
|
11 |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
12 #ifdef __APPLE__ |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
13 /* Perform runtime testing for a broken poll on OSX to make it easier |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
14 * to use the same binary on multiple releases of the OS. |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
15 */ |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
16 #undef HAVE_BROKEN_POLL |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
17 #endif |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
18 |
|
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
|
19 /* 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
|
20 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
|
21 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
|
22 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
|
23 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
|
24 */ |
|
e11c12323ebf
SF bug 110843: Low FD_SETSIZE limit on Win32 (PR#41). Boosted to 512.
Tim Peters <tim.peters@gmail.com>
parents:
14918
diff
changeset
|
25 #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
|
26 #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
|
27 #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
|
28 |
| 18603 | 29 #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
|
30 #include <poll.h> |
| 18603 | 31 #elif defined(HAVE_SYS_POLL_H) |
| 32 #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
|
33 #endif |
| 4600 | 34 |
|
4621
a2f171ce25f8
Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4600
diff
changeset
|
35 #ifdef __sgi |
|
a2f171ce25f8
Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4600
diff
changeset
|
36 /* 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
|
37 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
|
38 #endif |
|
a2f171ce25f8
Add ``extern void bzero();'' for SGI, to keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4600
diff
changeset
|
39 |
|
38716
42808526511c
Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
38489
diff
changeset
|
40 #ifdef HAVE_SYS_TYPES_H |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1392
diff
changeset
|
41 #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
|
42 #endif |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
43 |
|
22114
c454b76d51e7
OS/2 EMX port changes (Modules part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21712
diff
changeset
|
44 #if defined(PYOS_OS2) && !defined(PYCC_GCC) |
|
6626
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
45 #include <sys/time.h> |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
46 #include <utils.h> |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
47 #endif |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
6367
diff
changeset
|
48 |
|
3738
ce74bba8a6a6
Slightly different Windows ifdefs
Guido van Rossum <guido@python.org>
parents:
3675
diff
changeset
|
49 #ifdef MS_WINDOWS |
|
39043
c67b23397f30
Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38716
diff
changeset
|
50 # include <winsock.h> |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
51 #else |
|
39043
c67b23397f30
Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38716
diff
changeset
|
52 # define SOCKET int |
|
c67b23397f30
Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38716
diff
changeset
|
53 # ifdef __BEOS__ |
|
c67b23397f30
Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38716
diff
changeset
|
54 # include <net/socket.h> |
|
c67b23397f30
Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38716
diff
changeset
|
55 # elif defined(__VMS) |
|
c67b23397f30
Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38716
diff
changeset
|
56 # include <socket.h> |
|
c67b23397f30
Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38716
diff
changeset
|
57 # endif |
|
8823
f2a4a2b60860
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8616
diff
changeset
|
58 #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
|
59 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
60 static PyObject *SelectError; |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
62 /* list of Python objects and their file descriptor */ |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
63 typedef struct { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
64 PyObject *obj; /* owned reference */ |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
65 SOCKET fd; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
66 int sentinel; /* -1 == sentinel */ |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
67 } pylist; |
|
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
68 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
69 static void |
|
19328
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
70 reap_obj(pylist fd2obj[FD_SETSIZE + 1]) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
71 { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
72 int i; |
|
19328
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
73 for (i = 0; i < FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
74 Py_XDECREF(fd2obj[i].obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
75 fd2obj[i].obj = NULL; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
76 } |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
77 fd2obj[0].sentinel = -1; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
78 } |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
79 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
80 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
81 /* returns -1 and sets the Python exception if an error occurred, otherwise |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
82 returns a number >= 0 |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
83 */ |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
84 static int |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
85 seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1]) |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
87 int i; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
88 int max = -1; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
89 int index = 0; |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
90 int len = -1; |
|
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
91 PyObject* fast_seq = NULL; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
92 PyObject* o = NULL; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
93 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
94 fd2obj[0].obj = (PyObject*)0; /* set list to zero size */ |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
95 FD_ZERO(set); |
| 2611 | 96 |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
97 fast_seq=PySequence_Fast(seq, "arguments 1-3 must be sequences"); |
|
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
98 if (!fast_seq) |
|
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
99 return -1; |
|
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
100 |
|
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
101 len = PySequence_Fast_GET_SIZE(fast_seq); |
|
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
102 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
103 for (i = 0; i < len; i++) { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
104 SOCKET v; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
105 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
106 /* any intervening fileno() calls could decr this refcnt */ |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
107 if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i))) |
|
4734
3db423515626
list2set(): correct return value (an int, not a PyObject*).
Barry Warsaw <barry@python.org>
parents:
4730
diff
changeset
|
108 return -1; |
|
4730
62cf7d589300
list2set(): PyList_GetItem could fail.
Barry Warsaw <barry@python.org>
parents:
4700
diff
changeset
|
109 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
110 Py_INCREF(o); |
|
13593
df64cc0e84e2
Use PyObject_AsFileDescriptor
Andrew M. Kuchling <amk@amk.ca>
parents:
13550
diff
changeset
|
111 v = PyObject_AsFileDescriptor( o ); |
|
df64cc0e84e2
Use PyObject_AsFileDescriptor
Andrew M. Kuchling <amk@amk.ca>
parents:
13550
diff
changeset
|
112 if (v == -1) goto finally; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
113 |
|
11656
db756d31e727
According to Ron Bickers, and with apparent approval of Chris
Guido van Rossum <guido@python.org>
parents:
11243
diff
changeset
|
114 #if defined(_MSC_VER) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
115 max = 0; /* not used for Win32 */ |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
116 #else /* !_MSC_VER */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
117 if (v < 0 || v >= FD_SETSIZE) { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
118 PyErr_SetString(PyExc_ValueError, |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
119 "filedescriptor out of range in select()"); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
120 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
121 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
122 if (v > max) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
123 max = v; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
124 #endif /* _MSC_VER */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
125 FD_SET(v, set); |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
126 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
127 /* add object and its file descriptor to the list */ |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
128 if (index >= FD_SETSIZE) { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
129 PyErr_SetString(PyExc_ValueError, |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
130 "too many file descriptors in select()"); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
131 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
132 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
133 fd2obj[index].obj = o; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
134 fd2obj[index].fd = v; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
135 fd2obj[index].sentinel = 0; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
136 fd2obj[++index].sentinel = -1; |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
137 } |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
138 Py_DECREF(fast_seq); |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
139 return max+1; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
140 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
141 finally: |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
142 Py_XDECREF(o); |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
143 Py_DECREF(fast_seq); |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
144 return -1; |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
145 } |
|
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
146 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
147 /* returns NULL and sets the Python exception if an error occurred */ |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
148 static PyObject * |
|
19328
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
149 set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1]) |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
150 { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
151 int i, j, count=0; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
152 PyObject *list, *o; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
153 SOCKET fd; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
154 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
155 for (j = 0; fd2obj[j].sentinel >= 0; j++) { |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
156 if (FD_ISSET(fd2obj[j].fd, set)) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
157 count++; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
158 } |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
159 list = PyList_New(count); |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
160 if (!list) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
161 return NULL; |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
163 i = 0; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
164 for (j = 0; fd2obj[j].sentinel >= 0; j++) { |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
165 fd = fd2obj[j].fd; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
166 if (FD_ISSET(fd, set)) { |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
167 #ifndef _MSC_VER |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
168 if (fd > FD_SETSIZE) { |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
169 PyErr_SetString(PyExc_SystemError, |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
170 "filedescriptor out of range returned in select()"); |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
171 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
172 } |
|
3675
d617de15774b
Yet another pass at fd2obj -- this time for Windows
Guido van Rossum <guido@python.org>
parents:
2611
diff
changeset
|
173 #endif |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
174 o = fd2obj[j].obj; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
175 fd2obj[j].obj = NULL; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
176 /* transfer ownership */ |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
177 if (PyList_SetItem(list, i, o) < 0) |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
178 goto finally; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
179 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
180 i++; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
181 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
182 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
183 return list; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
184 finally: |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
185 Py_DECREF(list); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
186 return NULL; |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
187 } |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
188 |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
189 #undef SELECT_USES_HEAP |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
190 #if FD_SETSIZE > 1024 |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
191 #define SELECT_USES_HEAP |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
192 #endif /* FD_SETSIZE > 1024 */ |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
193 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
194 static PyObject * |
|
13502
7348cceee8fa
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13256
diff
changeset
|
195 select_select(PyObject *self, PyObject *args) |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
196 { |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
197 #ifdef SELECT_USES_HEAP |
|
8616
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
198 pylist *rfd2obj, *wfd2obj, *efd2obj; |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
199 #else /* !SELECT_USES_HEAP */ |
|
19328
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
200 /* XXX: All this should probably be implemented as follows: |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
201 * - find the highest descriptor we're interested in |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
202 * - add one |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
203 * - that's the size |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
204 * See: Stevens, APitUE, $12.5.1 |
|
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
205 */ |
|
19328
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
206 pylist rfd2obj[FD_SETSIZE + 1]; |
|
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
207 pylist wfd2obj[FD_SETSIZE + 1]; |
|
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
208 pylist efd2obj[FD_SETSIZE + 1]; |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
209 #endif /* SELECT_USES_HEAP */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
210 PyObject *ifdlist, *ofdlist, *efdlist; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
211 PyObject *ret = NULL; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
212 PyObject *tout = Py_None; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
213 fd_set ifdset, ofdset, efdset; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
214 double timeout; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
215 struct timeval tv, *tvp; |
| 13079 | 216 long seconds; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
217 int imax, omax, emax, max; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
218 int n; |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
219 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
220 /* convert arguments */ |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
37935
diff
changeset
|
221 if (!PyArg_UnpackTuple(args, "select", 3, 4, |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
222 &ifdlist, &ofdlist, &efdlist, &tout)) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
223 return NULL; |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
225 if (tout == Py_None) |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
226 tvp = (struct timeval *)0; |
|
24408
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
227 else if (!PyNumber_Check(tout)) { |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
228 PyErr_SetString(PyExc_TypeError, |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
229 "timeout must be a float or None"); |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
230 return NULL; |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
231 } |
|
1390
cffe8d6b2f09
* selectmodule.c (select_select): timeout argument may be None with same
Guido van Rossum <guido@python.org>
parents:
1284
diff
changeset
|
232 else { |
|
26270
e270c0d41a05
Don't use PyNumber_Float() since it's is nearly useless. Instead, rely on
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26153
diff
changeset
|
233 timeout = PyFloat_AsDouble(tout); |
|
e270c0d41a05
Don't use PyNumber_Float() since it's is nearly useless. Instead, rely on
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
26153
diff
changeset
|
234 if (timeout == -1 && PyErr_Occurred()) |
|
24408
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
235 return NULL; |
| 13079 | 236 if (timeout > (double)LONG_MAX) { |
|
19311
fc7617312182
Fixed a couple of minor formatting nits where lines were > 79 columns wide.
Barry Warsaw <barry@python.org>
parents:
19310
diff
changeset
|
237 PyErr_SetString(PyExc_OverflowError, |
|
fc7617312182
Fixed a couple of minor formatting nits where lines were > 79 columns wide.
Barry Warsaw <barry@python.org>
parents:
19310
diff
changeset
|
238 "timeout period too long"); |
| 13079 | 239 return NULL; |
| 240 } | |
| 241 seconds = (long)timeout; | |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
242 timeout = timeout - (double)seconds; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
243 tv.tv_sec = seconds; |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
244 tv.tv_usec = (long)(timeout * 1E6); |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
245 tvp = &tv; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
246 } |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
247 |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
248 |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
249 #ifdef SELECT_USES_HEAP |
|
8616
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
250 /* Allocate memory for the lists */ |
|
19328
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
251 rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1); |
|
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
252 wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1); |
|
b41638a11e4e
Stop adding 3 to FD_SETSIZE -- it makes no sense. If it turns out it
Tim Peters <tim.peters@gmail.com>
parents:
19311
diff
changeset
|
253 efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1); |
|
8616
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
254 if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) { |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
255 if (rfd2obj) PyMem_DEL(rfd2obj); |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
256 if (wfd2obj) PyMem_DEL(wfd2obj); |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
257 if (efd2obj) PyMem_DEL(efd2obj); |
|
27815
cb1eeaeb74a0
SF bug 684667: Modules/selectmodule.c returns NULL without exception set.
Tim Peters <tim.peters@gmail.com>
parents:
26270
diff
changeset
|
258 return PyErr_NoMemory(); |
|
8616
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
259 } |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
260 #endif /* SELECT_USES_HEAP */ |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
261 /* Convert sequences to fd_sets, and get maximum fd number |
|
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
262 * propagates the Python exception set in seq2set() |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
263 */ |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
264 rfd2obj[0].sentinel = -1; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
265 wfd2obj[0].sentinel = -1; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
266 efd2obj[0].sentinel = -1; |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
267 if ((imax=seq2set(ifdlist, &ifdset, rfd2obj)) < 0) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
268 goto finally; |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
269 if ((omax=seq2set(ofdlist, &ofdset, wfd2obj)) < 0) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
270 goto finally; |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
271 if ((emax=seq2set(efdlist, &efdset, efd2obj)) < 0) |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
272 goto finally; |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
273 max = imax; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
274 if (omax > max) max = omax; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
275 if (emax > max) max = emax; |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
276 |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
277 Py_BEGIN_ALLOW_THREADS |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
278 n = select(max, &ifdset, &ofdset, &efdset, tvp); |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
279 Py_END_ALLOW_THREADS |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
280 |
|
25399
97424b99df91
On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents:
24408
diff
changeset
|
281 #ifdef MS_WINDOWS |
|
97424b99df91
On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents:
24408
diff
changeset
|
282 if (n == SOCKET_ERROR) { |
|
97424b99df91
On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents:
24408
diff
changeset
|
283 PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError()); |
|
97424b99df91
On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents:
24408
diff
changeset
|
284 } |
|
97424b99df91
On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents:
24408
diff
changeset
|
285 #else |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
286 if (n < 0) { |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
287 PyErr_SetFromErrno(SelectError); |
|
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
288 } |
|
25399
97424b99df91
On Windows, call WSAGetLastError() to retrieve the error number.
Thomas Heller <theller@ctypes.org>
parents:
24408
diff
changeset
|
289 #endif |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
290 else if (n == 0) { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
291 /* optimization */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
292 ifdlist = PyList_New(0); |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
293 if (ifdlist) { |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
30402
diff
changeset
|
294 ret = PyTuple_Pack(3, ifdlist, ifdlist, ifdlist); |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
295 Py_DECREF(ifdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
296 } |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
297 } |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
298 else { |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
299 /* any of these three calls can raise an exception. it's more |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
300 convenient to test for this after all three calls... but |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
301 is that acceptable? |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
302 */ |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
303 ifdlist = set2list(&ifdset, rfd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
304 ofdlist = set2list(&ofdset, wfd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
305 efdlist = set2list(&efdset, efd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
306 if (PyErr_Occurred()) |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
307 ret = NULL; |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
308 else |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
30402
diff
changeset
|
309 ret = PyTuple_Pack(3, ifdlist, ofdlist, efdlist); |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
310 |
|
4700
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
311 Py_DECREF(ifdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
312 Py_DECREF(ofdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
313 Py_DECREF(efdlist); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
314 } |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
315 |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
316 finally: |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
317 reap_obj(rfd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
318 reap_obj(wfd2obj); |
|
825038d98ab6
Reworked to eliminate all potential memory problems, including
Barry Warsaw <barry@python.org>
parents:
4692
diff
changeset
|
319 reap_obj(efd2obj); |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
320 #ifdef SELECT_USES_HEAP |
|
8616
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
321 PyMem_DEL(rfd2obj); |
|
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
322 PyMem_DEL(wfd2obj); |
|
2417f17fa3e5
On Windows, put the select file descriptor arrays on the heap.
Guido van Rossum <guido@python.org>
parents:
8570
diff
changeset
|
323 PyMem_DEL(efd2obj); |
|
19310
6cb9f538dce4
select_select(): Closing bug #448351 the easy way, i.e. by changing
Barry Warsaw <barry@python.org>
parents:
18754
diff
changeset
|
324 #endif /* SELECT_USES_HEAP */ |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
325 return ret; |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 } |
|
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 |
|
31761
f4a4ac7331ec
Added configure check for broken poll() on some unix systems (MacOS X 10.3)
Nicholas Bastin <nick.bastin@gmail.com>
parents:
30683
diff
changeset
|
328 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
329 /* |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
330 * poll() support |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
331 */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
332 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
333 typedef struct { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
334 PyObject_HEAD |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
335 PyObject *dict; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
336 int ufd_uptodate; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
337 int ufd_len; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
338 struct pollfd *ufds; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
339 } pollObject; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
340 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23832
diff
changeset
|
341 static PyTypeObject poll_Type; |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
342 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
343 /* Update the malloc'ed array of pollfds to match the dictionary |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
344 contained within a pollObject. Return 1 on success, 0 on an error. |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
345 */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
346 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
347 static int |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
348 update_ufd_array(pollObject *self) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
349 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
350 Py_ssize_t i, pos; |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
351 PyObject *key, *value; |
|
48046
5d3833e6aae3
Issue #2620: Overflow checking when allocating or reallocating memory
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
352 struct pollfd *old_ufds = self->ufds; |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
353 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
354 self->ufd_len = PyDict_Size(self->dict); |
|
48046
5d3833e6aae3
Issue #2620: Overflow checking when allocating or reallocating memory
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
355 PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
356 if (self->ufds == NULL) { |
|
48046
5d3833e6aae3
Issue #2620: Overflow checking when allocating or reallocating memory
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
357 self->ufds = old_ufds; |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
358 PyErr_NoMemory(); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
359 return 0; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
360 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
361 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
362 i = pos = 0; |
|
18754
3cd03a64c338
Make more warnings go away on the SGI compiler.
Fred Drake <fdrake@acm.org>
parents:
18603
diff
changeset
|
363 while (PyDict_Next(self->dict, &pos, &key, &value)) { |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
364 self->ufds[i].fd = PyInt_AsLong(key); |
|
18754
3cd03a64c338
Make more warnings go away on the SGI compiler.
Fred Drake <fdrake@acm.org>
parents:
18603
diff
changeset
|
365 self->ufds[i].events = (short)PyInt_AsLong(value); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
366 i++; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
367 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
368 self->ufd_uptodate = 1; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
369 return 1; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
370 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
371 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
372 PyDoc_STRVAR(poll_register_doc, |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
373 "register(fd [, eventmask] ) -> None\n\n\ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
374 Register a file descriptor with the polling object.\n\ |
|
19311
fc7617312182
Fixed a couple of minor formatting nits where lines were > 79 columns wide.
Barry Warsaw <barry@python.org>
parents:
19310
diff
changeset
|
375 fd -- either an integer, or an object with a fileno() method returning an\n\ |
|
fc7617312182
Fixed a couple of minor formatting nits where lines were > 79 columns wide.
Barry Warsaw <barry@python.org>
parents:
19310
diff
changeset
|
376 int.\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
377 events -- an optional bitmask describing the type of events to check for"); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
378 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
379 static PyObject * |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
380 poll_register(pollObject *self, PyObject *args) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
381 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
382 PyObject *o, *key, *value; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
383 int fd, events = POLLIN | POLLPRI | POLLOUT; |
|
20668
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
384 int err; |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
385 |
|
17873
1eb12259feea
Add :method info to the PyArg_ParseTuple() format strings for poll objects.
Fred Drake <fdrake@acm.org>
parents:
16946
diff
changeset
|
386 if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) { |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
387 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
388 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
389 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
390 fd = PyObject_AsFileDescriptor(o); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
391 if (fd == -1) return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
392 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
393 /* Add entry to the internal dictionary: the key is the |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
394 file descriptor, and the value is the event mask. */ |
|
20668
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
395 key = PyInt_FromLong(fd); |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
396 if (key == NULL) |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
397 return NULL; |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
398 value = PyInt_FromLong(events); |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
399 if (value == NULL) { |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
400 Py_DECREF(key); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
401 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
402 } |
|
20668
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
403 err = PyDict_SetItem(self->dict, key, value); |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
404 Py_DECREF(key); |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
405 Py_DECREF(value); |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
406 if (err < 0) |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
407 return NULL; |
|
3e9b85de447b
Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck)
Guido van Rossum <guido@python.org>
parents:
20654
diff
changeset
|
408 |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
409 self->ufd_uptodate = 0; |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
410 |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
411 Py_INCREF(Py_None); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
412 return Py_None; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
413 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
414 |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
415 PyDoc_STRVAR(poll_modify_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
416 "modify(fd, eventmask) -> None\n\n\ |
| 46094 | 417 Modify an already registered file descriptor.\n\ |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
418 fd -- either an integer, or an object with a fileno() method returning an\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
419 int.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
420 events -- an optional bitmask describing the type of events to check for"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
421 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
422 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
423 poll_modify(pollObject *self, PyObject *args) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
424 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
425 PyObject *o, *key, *value; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
426 int fd, events; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
427 int err; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
428 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
429 if (!PyArg_ParseTuple(args, "Oi:modify", &o, &events)) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
430 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
431 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
432 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
433 fd = PyObject_AsFileDescriptor(o); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
434 if (fd == -1) return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
435 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
436 /* Modify registered fd */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
437 key = PyInt_FromLong(fd); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
438 if (key == NULL) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
439 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
440 if (PyDict_GetItem(self->dict, key) == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
441 errno = ENOENT; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
442 PyErr_SetFromErrno(PyExc_IOError); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
443 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
444 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
445 value = PyInt_FromLong(events); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
446 if (value == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
447 Py_DECREF(key); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
448 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
449 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
450 err = PyDict_SetItem(self->dict, key, value); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
451 Py_DECREF(key); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
452 Py_DECREF(value); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
453 if (err < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
454 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
455 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
456 self->ufd_uptodate = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
457 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
458 Py_INCREF(Py_None); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
459 return Py_None; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
460 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
461 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
462 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
463 PyDoc_STRVAR(poll_unregister_doc, |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
464 "unregister(fd) -> None\n\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
465 Remove a file descriptor being tracked by the polling object."); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
466 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
467 static PyObject * |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
37935
diff
changeset
|
468 poll_unregister(pollObject *self, PyObject *o) |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
469 { |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
37935
diff
changeset
|
470 PyObject *key; |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
471 int fd; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
472 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
473 fd = PyObject_AsFileDescriptor( o ); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
474 if (fd == -1) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
475 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
476 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
477 /* 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
|
478 key = PyInt_FromLong(fd); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
479 if (key == NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
480 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
481 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
482 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
|
483 Py_DECREF(key); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
484 /* 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
|
485 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
|
486 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
487 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
488 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
489 Py_DECREF(key); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
490 self->ufd_uptodate = 0; |
|
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 Py_INCREF(Py_None); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
493 return Py_None; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
494 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
495 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
496 PyDoc_STRVAR(poll_poll_doc, |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
497 "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
|
498 Polls the set of registered file descriptors, returning a list containing \n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
499 any descriptors that have events or errors to report."); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
500 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
501 static PyObject * |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
502 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
|
503 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
504 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
|
505 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
|
506 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
|
507 |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
37935
diff
changeset
|
508 if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) { |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
509 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
510 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
511 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
512 /* Check values for timeout */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
513 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
|
514 timeout = -1; |
|
24408
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
515 else if (!PyNumber_Check(tout)) { |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
516 PyErr_SetString(PyExc_TypeError, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
517 "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
|
518 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
519 } |
|
24408
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
520 else { |
|
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
521 tout = PyNumber_Int(tout); |
|
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
522 if (!tout) |
|
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
523 return NULL; |
|
26153
6078abc69036
Use PyInt_AsLong instead of PyInt_AS_LONG after the call to
Walter Dörwald <walter@livinglogic.de>
parents:
25400
diff
changeset
|
524 timeout = PyInt_AsLong(tout); |
|
24408
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
525 Py_DECREF(tout); |
|
35834
418a61ead11b
Bug #1346533, select.poll() doesn't raise an error if timeout > sys.maxint
Neal Norwitz <nnorwitz@gmail.com>
parents:
33007
diff
changeset
|
526 if (timeout == -1 && PyErr_Occurred()) |
|
418a61ead11b
Bug #1346533, select.poll() doesn't raise an error if timeout > sys.maxint
Neal Norwitz <nnorwitz@gmail.com>
parents:
33007
diff
changeset
|
527 return NULL; |
|
24408
4de5c7e6231e
SF patch #577031, remove PyArg_Parse() since it's deprecated
Neal Norwitz <nnorwitz@gmail.com>
parents:
24363
diff
changeset
|
528 } |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
529 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
530 /* 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
|
531 if (!self->ufd_uptodate) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
532 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
|
533 return NULL; |
|
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 /* call poll() */ |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
536 Py_BEGIN_ALLOW_THREADS |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
537 poll_result = poll(self->ufds, self->ufd_len, timeout); |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
538 Py_END_ALLOW_THREADS |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
539 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
540 if (poll_result < 0) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
541 PyErr_SetFromErrno(SelectError); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
542 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
543 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
544 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
545 /* build the result list */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
546 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
547 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
|
548 if (!result_list) |
|
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 else { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
551 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
|
552 /* 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
|
553 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
|
554 i++; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
555 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
556 /* 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
|
557 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
|
558 clean up result_list */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
559 value = PyTuple_New(2); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
560 if (value == NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
561 goto error; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
562 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
|
563 if (num == NULL) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
564 Py_DECREF(value); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
565 goto error; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
566 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
567 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
|
568 |
|
33007
9fb2e30f26be
[Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents:
31761
diff
changeset
|
569 /* The &0xffff is a workaround for AIX. 'revents' |
|
9fb2e30f26be
[Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents:
31761
diff
changeset
|
570 is a 16-bit short, and IBM assigned POLLNVAL |
|
9fb2e30f26be
[Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents:
31761
diff
changeset
|
571 to be 0x8000, so the conversion to int results |
|
9fb2e30f26be
[Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents:
31761
diff
changeset
|
572 in a negative number. See SF bug #923315. */ |
|
9fb2e30f26be
[Bug #923315] Produce correct result on AIX
Andrew M. Kuchling <amk@amk.ca>
parents:
31761
diff
changeset
|
573 num = PyInt_FromLong(self->ufds[i].revents & 0xffff); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
574 if (num == NULL) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
575 Py_DECREF(value); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
576 goto error; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
577 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
578 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
|
579 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
|
580 Py_DECREF(value); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
581 goto error; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
582 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
583 i++; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
584 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
585 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
586 return result_list; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
587 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
588 error: |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
589 Py_DECREF(result_list); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
590 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
591 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
592 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
593 static PyMethodDef poll_methods[] = { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
594 {"register", (PyCFunction)poll_register, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
595 METH_VARARGS, poll_register_doc}, |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
596 {"modify", (PyCFunction)poll_modify, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
597 METH_VARARGS, poll_modify_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
598 {"unregister", (PyCFunction)poll_unregister, |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
37935
diff
changeset
|
599 METH_O, poll_unregister_doc}, |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
600 {"poll", (PyCFunction)poll_poll, |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
601 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
|
602 {NULL, NULL} /* sentinel */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
603 }; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
604 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
605 static pollObject * |
|
14277
984abd20eec2
Peter Schneider-Kamp <nowonder@nowonder.de>:
Fred Drake <fdrake@acm.org>
parents:
14182
diff
changeset
|
606 newPollObject(void) |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
607 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
608 pollObject *self; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
609 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
|
610 if (self == NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
611 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
612 /* 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
|
613 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
|
614 self->ufd_uptodate = 0; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
615 self->ufds = NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
616 self->dict = PyDict_New(); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
617 if (self->dict == NULL) { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
618 Py_DECREF(self); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
619 return NULL; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
620 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
621 return self; |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
622 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
623 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
624 static void |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
625 poll_dealloc(pollObject *self) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
626 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
627 if (self->ufds != NULL) |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
628 PyMem_DEL(self->ufds); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
629 Py_XDECREF(self->dict); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
630 PyObject_Del(self); |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
631 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
632 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
633 static PyObject * |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
634 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
|
635 { |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
636 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
|
637 } |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
638 |
|
24283
c0a67a1cab09
Removed more stray instances of statichere, but left _sre.c alone.
Tim Peters <tim.peters@gmail.com>
parents:
24280
diff
changeset
|
639 static PyTypeObject poll_Type = { |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
640 /* 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
|
641 * to be portable to Windows without using C++. */ |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
39043
diff
changeset
|
642 PyVarObject_HEAD_INIT(NULL, 0) |
|
21313
91dd223829c6
Patch supplied by Burton Radons for his own SF bug #487390: Modifying
Guido van Rossum <guido@python.org>
parents:
20668
diff
changeset
|
643 "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
|
644 sizeof(pollObject), /*tp_basicsize*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
645 0, /*tp_itemsize*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
646 /* methods */ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
647 (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
|
648 0, /*tp_print*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
649 (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
|
650 0, /*tp_setattr*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
651 0, /*tp_compare*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
652 0, /*tp_repr*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
653 0, /*tp_as_number*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
654 0, /*tp_as_sequence*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
655 0, /*tp_as_mapping*/ |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
656 0, /*tp_hash*/ |
|
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 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
659 PyDoc_STRVAR(poll_doc, |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
660 "Returns a polling object, which supports registering and\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
661 unregistering file descriptors, and then polling them for I/O events."); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
662 |
|
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
663 static PyObject * |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
37935
diff
changeset
|
664 select_poll(PyObject *self, PyObject *unused) |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
665 { |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
37935
diff
changeset
|
666 return (PyObject *)newPollObject(); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
667 } |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
668 |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
669 #ifdef __APPLE__ |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
670 /* |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
671 * On some systems poll() sets errno on invalid file descriptors. We test |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
672 * for this at runtime because this bug may be fixed or introduced between |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
673 * OS releases. |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
674 */ |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
675 static int select_have_broken_poll(void) |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
676 { |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
677 int poll_test; |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
678 int filedes[2]; |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
679 |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
680 struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 }; |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
681 |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
682 /* Create a file descriptor to make invalid */ |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
683 if (pipe(filedes) < 0) { |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
684 return 1; |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
685 } |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
686 poll_struct.fd = filedes[0]; |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
687 close(filedes[0]); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
688 close(filedes[1]); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
689 poll_test = poll(&poll_struct, 1, 0); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
690 if (poll_test < 0) { |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
691 return 1; |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
692 } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) { |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
693 return 1; |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
694 } |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
695 return 0; |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
696 } |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
697 #endif /* __APPLE__ */ |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
698 |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
699 #endif /* HAVE_POLL */ |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
700 |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
701 #ifdef HAVE_EPOLL |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
702 /* ************************************************************************** |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
703 * epoll interface for Linux 2.6 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
704 * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
705 * Written by Christian Heimes |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
706 * Inspired by Twisted's _epoll.pyx and select.poll() |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
707 */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
708 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
709 #ifdef HAVE_SYS_EPOLL_H |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
710 #include <sys/epoll.h> |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
711 #endif |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
712 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
713 typedef struct { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
714 PyObject_HEAD |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
715 SOCKET epfd; /* epoll control file descriptor */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
716 } pyEpoll_Object; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
717 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
718 static PyTypeObject pyEpoll_Type; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
719 #define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type)) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
720 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
721 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
722 pyepoll_err_closed(void) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
723 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
724 PyErr_SetString(PyExc_ValueError, "I/O operation on closed epoll fd"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
725 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
726 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
727 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
728 static int |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
729 pyepoll_internal_close(pyEpoll_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
730 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
731 int save_errno = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
732 if (self->epfd >= 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
733 int epfd = self->epfd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
734 self->epfd = -1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
735 Py_BEGIN_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
736 if (close(epfd) < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
737 save_errno = errno; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
738 Py_END_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
739 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
740 return save_errno; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
741 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
742 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
743 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
744 newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
745 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
746 pyEpoll_Object *self; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
747 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
748 if (sizehint == -1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
749 sizehint = FD_SETSIZE-1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
750 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
751 else if (sizehint < 1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
752 PyErr_Format(PyExc_ValueError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
753 "sizehint must be greater zero, got %d", |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
754 sizehint); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
755 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
756 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
757 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
758 assert(type != NULL && type->tp_alloc != NULL); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
759 self = (pyEpoll_Object *) type->tp_alloc(type, 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
760 if (self == NULL) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
761 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
762 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
763 if (fd == -1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
764 Py_BEGIN_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
765 self->epfd = epoll_create(sizehint); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
766 Py_END_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
767 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
768 else { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
769 self->epfd = fd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
770 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
771 if (self->epfd < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
772 Py_DECREF(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
773 PyErr_SetFromErrno(PyExc_IOError); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
774 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
775 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
776 return (PyObject *)self; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
777 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
778 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
779 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
780 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
781 pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
782 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
783 int sizehint = -1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
784 static char *kwlist[] = {"sizehint", NULL}; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
785 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
786 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
787 &sizehint)) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
788 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
789 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
790 return newPyEpoll_Object(type, sizehint, -1); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
791 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
792 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
793 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
794 static void |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
795 pyepoll_dealloc(pyEpoll_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
796 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
797 (void)pyepoll_internal_close(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
798 Py_TYPE(self)->tp_free(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
799 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
800 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
801 static PyObject* |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
802 pyepoll_close(pyEpoll_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
803 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
804 errno = pyepoll_internal_close(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
805 if (errno < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
806 PyErr_SetFromErrno(PyExc_IOError); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
807 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
808 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
809 Py_RETURN_NONE; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
810 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
811 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
812 PyDoc_STRVAR(pyepoll_close_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
813 "close() -> None\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
814 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
815 Close the epoll control file descriptor. Further operations on the epoll\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
816 object will raise an exception."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
817 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
818 static PyObject* |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
819 pyepoll_get_closed(pyEpoll_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
820 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
821 if (self->epfd < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
822 Py_RETURN_TRUE; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
823 else |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
824 Py_RETURN_FALSE; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
825 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
826 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
827 static PyObject* |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
828 pyepoll_fileno(pyEpoll_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
829 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
830 if (self->epfd < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
831 return pyepoll_err_closed(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
832 return PyInt_FromLong(self->epfd); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
833 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
834 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
835 PyDoc_STRVAR(pyepoll_fileno_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
836 "fileno() -> int\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
837 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
838 Return the epoll control file descriptor."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
839 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
840 static PyObject* |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
841 pyepoll_fromfd(PyObject *cls, PyObject *args) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
842 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
843 SOCKET fd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
844 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
845 if (!PyArg_ParseTuple(args, "i:fromfd", &fd)) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
846 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
847 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
848 return newPyEpoll_Object((PyTypeObject*)cls, -1, fd); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
849 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
850 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
851 PyDoc_STRVAR(pyepoll_fromfd_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
852 "fromfd(fd) -> epoll\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
853 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
854 Create an epoll object from a given control fd."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
855 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
856 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
857 pyepoll_internal_ctl(int epfd, int op, PyObject *pfd, unsigned int events) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
858 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
859 struct epoll_event ev; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
860 int result; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
861 int fd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
862 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
863 if (epfd < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
864 return pyepoll_err_closed(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
865 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
866 fd = PyObject_AsFileDescriptor(pfd); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
867 if (fd == -1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
868 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
869 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
870 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
871 switch(op) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
872 case EPOLL_CTL_ADD: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
873 case EPOLL_CTL_MOD: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
874 ev.events = events; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
875 ev.data.fd = fd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
876 Py_BEGIN_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
877 result = epoll_ctl(epfd, op, fd, &ev); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
878 Py_END_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
879 break; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
880 case EPOLL_CTL_DEL: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
881 /* In kernel versions before 2.6.9, the EPOLL_CTL_DEL |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
882 * operation required a non-NULL pointer in event, even |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
883 * though this argument is ignored. */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
884 Py_BEGIN_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
885 result = epoll_ctl(epfd, op, fd, &ev); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
886 if (errno == EBADF) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
887 /* fd already closed */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
888 result = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
889 errno = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
890 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
891 Py_END_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
892 break; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
893 default: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
894 result = -1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
895 errno = EINVAL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
896 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
897 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
898 if (result < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
899 PyErr_SetFromErrno(PyExc_IOError); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
900 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
901 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
902 Py_RETURN_NONE; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
903 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
904 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
905 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
906 pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
907 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
908 PyObject *pfd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
909 unsigned int events = EPOLLIN | EPOLLOUT | EPOLLPRI; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
910 static char *kwlist[] = {"fd", "eventmask", NULL}; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
911 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
912 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|I:register", kwlist, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
913 &pfd, &events)) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
914 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
915 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
916 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
917 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_ADD, pfd, events); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
918 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
919 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
920 PyDoc_STRVAR(pyepoll_register_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
921 "register(fd[, eventmask]) -> bool\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
922 \n\ |
| 46094 | 923 Registers a new fd or modifies an already registered fd. register() returns\n\ |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
924 True if a new fd was registered or False if the event mask for fd was modified.\n\ |
| 46094 | 925 fd is the target file descriptor of the operation.\n\ |
| 926 events is a bit set composed of the various EPOLL constants; the default\n\ | |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
927 is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
928 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
929 The epoll interface supports all file descriptors that support poll."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
930 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
931 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
932 pyepoll_modify(pyEpoll_Object *self, PyObject *args, PyObject *kwds) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
933 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
934 PyObject *pfd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
935 unsigned int events; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
936 static char *kwlist[] = {"fd", "eventmask", NULL}; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
937 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
938 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OI:modify", kwlist, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
939 &pfd, &events)) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
940 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
941 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
942 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
943 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_MOD, pfd, events); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
944 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
945 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
946 PyDoc_STRVAR(pyepoll_modify_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
947 "modify(fd, eventmask) -> None\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
948 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
949 fd is the target file descriptor of the operation\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
950 events is a bit set composed of the various EPOLL constants"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
951 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
952 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
953 pyepoll_unregister(pyEpoll_Object *self, PyObject *args, PyObject *kwds) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
954 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
955 PyObject *pfd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
956 static char *kwlist[] = {"fd", NULL}; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
957 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
958 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:unregister", kwlist, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
959 &pfd)) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
960 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
961 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
962 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
963 return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_DEL, pfd, 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
964 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
965 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
966 PyDoc_STRVAR(pyepoll_unregister_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
967 "unregister(fd) -> None\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
968 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
969 fd is the target file descriptor of the operation."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
970 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
971 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
972 pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
973 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
974 double dtimeout = -1.; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
975 int timeout; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
976 int maxevents = -1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
977 int nfds, i; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
978 PyObject *elist = NULL, *etuple = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
979 struct epoll_event *evs = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
980 static char *kwlist[] = {"timeout", "maxevents", NULL}; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
981 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
982 if (self->epfd < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
983 return pyepoll_err_closed(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
984 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
985 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|di:poll", kwlist, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
986 &dtimeout, &maxevents)) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
987 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
988 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
989 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
990 if (dtimeout < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
991 timeout = -1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
992 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
993 else if (dtimeout * 1000.0 > INT_MAX) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
994 PyErr_SetString(PyExc_OverflowError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
995 "timeout is too large"); |
|
46113
8d6fde16e493
Fix and simplify error handling, silencing a compiler warning.
Georg Brandl <georg@python.org>
parents:
46094
diff
changeset
|
996 return NULL; |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
997 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
998 else { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
999 timeout = (int)(dtimeout * 1000.0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1000 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1001 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1002 if (maxevents == -1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1003 maxevents = FD_SETSIZE-1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1004 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1005 else if (maxevents < 1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1006 PyErr_Format(PyExc_ValueError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1007 "maxevents must be greater than 0, got %d", |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1008 maxevents); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1009 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1010 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1011 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1012 evs = PyMem_New(struct epoll_event, maxevents); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1013 if (evs == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1014 Py_DECREF(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1015 PyErr_NoMemory(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1016 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1017 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1018 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1019 Py_BEGIN_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1020 nfds = epoll_wait(self->epfd, evs, maxevents, timeout); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1021 Py_END_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1022 if (nfds < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1023 PyErr_SetFromErrno(PyExc_IOError); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1024 goto error; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1025 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1026 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1027 elist = PyList_New(nfds); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1028 if (elist == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1029 goto error; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1030 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1031 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1032 for (i = 0; i < nfds; i++) { |
|
46113
8d6fde16e493
Fix and simplify error handling, silencing a compiler warning.
Georg Brandl <georg@python.org>
parents:
46094
diff
changeset
|
1033 etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events); |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1034 if (etuple == NULL) { |
|
46113
8d6fde16e493
Fix and simplify error handling, silencing a compiler warning.
Georg Brandl <georg@python.org>
parents:
46094
diff
changeset
|
1035 Py_CLEAR(elist); |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1036 goto error; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1037 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1038 PyList_SET_ITEM(elist, i, etuple); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1039 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1040 |
|
46113
8d6fde16e493
Fix and simplify error handling, silencing a compiler warning.
Georg Brandl <georg@python.org>
parents:
46094
diff
changeset
|
1041 error: |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1042 PyMem_Free(evs); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1043 return elist; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1044 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1045 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1046 PyDoc_STRVAR(pyepoll_poll_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1047 "poll([timeout=-1[, maxevents=-1]]) -> [(fd, events), (...)]\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1048 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1049 Wait for events on the epoll file descriptor for a maximum time of timeout\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1050 in seconds (as float). -1 makes poll wait indefinitely.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1051 Up to maxevents are returned to the caller."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1052 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1053 static PyMethodDef pyepoll_methods[] = { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1054 {"fromfd", (PyCFunction)pyepoll_fromfd, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1055 METH_VARARGS | METH_CLASS, pyepoll_fromfd_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1056 {"close", (PyCFunction)pyepoll_close, METH_NOARGS, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1057 pyepoll_close_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1058 {"fileno", (PyCFunction)pyepoll_fileno, METH_NOARGS, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1059 pyepoll_fileno_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1060 {"modify", (PyCFunction)pyepoll_modify, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1061 METH_VARARGS | METH_KEYWORDS, pyepoll_modify_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1062 {"register", (PyCFunction)pyepoll_register, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1063 METH_VARARGS | METH_KEYWORDS, pyepoll_register_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1064 {"unregister", (PyCFunction)pyepoll_unregister, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1065 METH_VARARGS | METH_KEYWORDS, pyepoll_unregister_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1066 {"poll", (PyCFunction)pyepoll_poll, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1067 METH_VARARGS | METH_KEYWORDS, pyepoll_poll_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1068 {NULL, NULL}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1069 }; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1070 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1071 static PyGetSetDef pyepoll_getsetlist[] = { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1072 {"closed", (getter)pyepoll_get_closed, NULL, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1073 "True if the epoll handler is closed"}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1074 {0}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1075 }; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1076 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1077 PyDoc_STRVAR(pyepoll_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1078 "select.epoll([sizehint=-1])\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1079 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1080 Returns an epolling object\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1081 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1082 sizehint must be a positive integer or -1 for the default size. The\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1083 sizehint is used to optimize internal data structures. It doesn't limit\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1084 the maximum number of monitored events."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1085 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1086 static PyTypeObject pyEpoll_Type = { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1087 PyVarObject_HEAD_INIT(NULL, 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1088 "select.epoll", /* tp_name */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1089 sizeof(pyEpoll_Object), /* tp_basicsize */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1090 0, /* tp_itemsize */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1091 (destructor)pyepoll_dealloc, /* tp_dealloc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1092 0, /* tp_print */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1093 0, /* tp_getattr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1094 0, /* tp_setattr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1095 0, /* tp_compare */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1096 0, /* tp_repr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1097 0, /* tp_as_number */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1098 0, /* tp_as_sequence */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1099 0, /* tp_as_mapping */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1100 0, /* tp_hash */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1101 0, /* tp_call */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1102 0, /* tp_str */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1103 PyObject_GenericGetAttr, /* tp_getattro */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1104 0, /* tp_setattro */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1105 0, /* tp_as_buffer */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1106 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1107 pyepoll_doc, /* tp_doc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1108 0, /* tp_traverse */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1109 0, /* tp_clear */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1110 0, /* tp_richcompare */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1111 0, /* tp_weaklistoffset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1112 0, /* tp_iter */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1113 0, /* tp_iternext */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1114 pyepoll_methods, /* tp_methods */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1115 0, /* tp_members */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1116 pyepoll_getsetlist, /* tp_getset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1117 0, /* tp_base */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1118 0, /* tp_dict */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1119 0, /* tp_descr_get */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1120 0, /* tp_descr_set */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1121 0, /* tp_dictoffset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1122 0, /* tp_init */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1123 0, /* tp_alloc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1124 pyepoll_new, /* tp_new */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1125 0, /* tp_free */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1126 }; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1127 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1128 #endif /* HAVE_EPOLL */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1129 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1130 #ifdef HAVE_KQUEUE |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1131 /* ************************************************************************** |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1132 * kqueue interface for BSD |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1133 * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1134 * Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1135 * All rights reserved. |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1136 * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1137 * Redistribution and use in source and binary forms, with or without |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1138 * modification, are permitted provided that the following conditions |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1139 * are met: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1140 * 1. Redistributions of source code must retain the above copyright |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1141 * notice, this list of conditions and the following disclaimer. |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1142 * 2. Redistributions in binary form must reproduce the above copyright |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1143 * notice, this list of conditions and the following disclaimer in the |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1144 * documentation and/or other materials provided with the distribution. |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1145 * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1146 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1147 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1148 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1149 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1150 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1151 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1152 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1153 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1154 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1155 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1156 * SUCH DAMAGE. |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1157 */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1158 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1159 #ifdef HAVE_SYS_EVENT_H |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1160 #include <sys/event.h> |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1161 #endif |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1162 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1163 PyDoc_STRVAR(kqueue_event_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1164 "kevent(ident, filter=KQ_FILTER_READ, flags=KQ_ADD, fflags=0, data=0, udata=0)\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1165 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1166 This object is the equivalent of the struct kevent for the C API.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1167 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1168 See the kqueue manpage for more detailed information about the meaning\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1169 of the arguments.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1170 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1171 One minor note: while you might hope that udata could store a\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1172 reference to a python object, it cannot, because it is impossible to\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1173 keep a proper reference count of the object once it's passed into the\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1174 kernel. Therefore, I have restricted it to only storing an integer. I\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1175 recommend ignoring it and simply using the 'ident' field to key off\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1176 of. You could also set up a dictionary on the python side to store a\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1177 udata->object mapping."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1178 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1179 typedef struct { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1180 PyObject_HEAD |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1181 struct kevent e; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1182 } kqueue_event_Object; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1183 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1184 static PyTypeObject kqueue_event_Type; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1185 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1186 #define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type)) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1187 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1188 typedef struct { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1189 PyObject_HEAD |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1190 SOCKET kqfd; /* kqueue control fd */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1191 } kqueue_queue_Object; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1192 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1193 static PyTypeObject kqueue_queue_Type; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1194 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1195 #define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type)) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1196 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1197 /* Unfortunately, we can't store python objects in udata, because |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1198 * kevents in the kernel can be removed without warning, which would |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1199 * forever lose the refcount on the object stored with it. |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1200 */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1201 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1202 #define KQ_OFF(x) offsetof(kqueue_event_Object, x) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1203 static struct PyMemberDef kqueue_event_members[] = { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1204 {"ident", T_UINT, KQ_OFF(e.ident)}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1205 {"filter", T_SHORT, KQ_OFF(e.filter)}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1206 {"flags", T_USHORT, KQ_OFF(e.flags)}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1207 {"fflags", T_UINT, KQ_OFF(e.fflags)}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1208 {"data", T_INT, KQ_OFF(e.data)}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1209 {"udata", T_INT, KQ_OFF(e.udata)}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1210 {NULL} /* Sentinel */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1211 }; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1212 #undef KQ_OFF |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1213 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1214 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1215 kqueue_event_repr(kqueue_event_Object *s) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1216 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1217 char buf[1024]; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1218 PyOS_snprintf( |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1219 buf, sizeof(buf), |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1220 "<select.kevent ident=%lu filter=%d flags=0x%x fflags=0x%x " |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1221 "data=0x%lx udata=%p>", |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1222 (unsigned long)(s->e.ident), s->e.filter, s->e.flags, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1223 s->e.fflags, (long)(s->e.data), s->e.udata); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1224 return PyString_FromString(buf); |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1225 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1226 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1227 static int |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1228 kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1229 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1230 PyObject *pfd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1231 static char *kwlist[] = {"ident", "filter", "flags", "fflags", |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1232 "data", "udata", NULL}; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1233 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1234 EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1235 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1236 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|hhiii:kevent", kwlist, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1237 &pfd, &(self->e.filter), &(self->e.flags), |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1238 &(self->e.fflags), &(self->e.data), &(self->e.udata))) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1239 return -1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1240 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1241 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1242 self->e.ident = PyObject_AsFileDescriptor(pfd); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1243 if (self->e.ident == -1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1244 return -1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1245 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1246 return 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1247 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1248 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1249 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1250 kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1251 int op) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1252 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1253 int result = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1254 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1255 if (!kqueue_event_Check(o)) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1256 if (op == Py_EQ || op == Py_NE) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1257 PyObject *res = op == Py_EQ ? Py_False : Py_True; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1258 Py_INCREF(res); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1259 return res; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1260 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1261 PyErr_Format(PyExc_TypeError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1262 "can't compare %.200s to %.200s", |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1263 Py_TYPE(s)->tp_name, Py_TYPE(o)->tp_name); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1264 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1265 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1266 if (((result = s->e.ident - o->e.ident) == 0) && |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1267 ((result = s->e.filter - o->e.filter) == 0) && |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1268 ((result = s->e.flags - o->e.flags) == 0) && |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1269 ((result = s->e.fflags - o->e.fflags) == 0) && |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1270 ((result = s->e.data - o->e.data) == 0) && |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1271 ((result = s->e.udata - o->e.udata) == 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1272 ) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1273 result = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1274 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1275 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1276 switch (op) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1277 case Py_EQ: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1278 result = (result == 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1279 break; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1280 case Py_NE: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1281 result = (result != 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1282 break; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1283 case Py_LE: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1284 result = (result <= 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1285 break; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1286 case Py_GE: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1287 result = (result >= 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1288 break; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1289 case Py_LT: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1290 result = (result < 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1291 break; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1292 case Py_GT: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1293 result = (result > 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1294 break; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1295 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1296 return PyBool_FromLong(result); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1297 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1298 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1299 static PyTypeObject kqueue_event_Type = { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1300 PyVarObject_HEAD_INIT(NULL, 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1301 "select.kevent", /* tp_name */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1302 sizeof(kqueue_event_Object), /* tp_basicsize */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1303 0, /* tp_itemsize */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1304 0, /* tp_dealloc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1305 0, /* tp_print */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1306 0, /* tp_getattr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1307 0, /* tp_setattr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1308 0, /* tp_compare */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1309 (reprfunc)kqueue_event_repr, /* tp_repr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1310 0, /* tp_as_number */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1311 0, /* tp_as_sequence */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1312 0, /* tp_as_mapping */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1313 0, /* tp_hash */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1314 0, /* tp_call */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1315 0, /* tp_str */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1316 0, /* tp_getattro */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1317 0, /* tp_setattro */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1318 0, /* tp_as_buffer */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1319 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1320 kqueue_event_doc, /* tp_doc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1321 0, /* tp_traverse */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1322 0, /* tp_clear */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1323 (richcmpfunc)kqueue_event_richcompare, /* tp_richcompare */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1324 0, /* tp_weaklistoffset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1325 0, /* tp_iter */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1326 0, /* tp_iternext */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1327 0, /* tp_methods */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1328 kqueue_event_members, /* tp_members */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1329 0, /* tp_getset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1330 0, /* tp_base */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1331 0, /* tp_dict */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1332 0, /* tp_descr_get */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1333 0, /* tp_descr_set */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1334 0, /* tp_dictoffset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1335 (initproc)kqueue_event_init, /* tp_init */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1336 0, /* tp_alloc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1337 0, /* tp_new */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1338 0, /* tp_free */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1339 }; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1340 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1341 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1342 kqueue_queue_err_closed(void) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1343 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1344 PyErr_SetString(PyExc_ValueError, "I/O operation on closed kqueue fd"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1345 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1346 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1347 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1348 static int |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1349 kqueue_queue_internal_close(kqueue_queue_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1350 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1351 int save_errno = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1352 if (self->kqfd >= 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1353 int kqfd = self->kqfd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1354 self->kqfd = -1; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1355 Py_BEGIN_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1356 if (close(kqfd) < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1357 save_errno = errno; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1358 Py_END_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1359 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1360 return save_errno; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1361 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1362 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1363 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1364 newKqueue_Object(PyTypeObject *type, SOCKET fd) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1365 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1366 kqueue_queue_Object *self; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1367 assert(type != NULL && type->tp_alloc != NULL); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1368 self = (kqueue_queue_Object *) type->tp_alloc(type, 0); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1369 if (self == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1370 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1371 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1372 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1373 if (fd == -1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1374 Py_BEGIN_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1375 self->kqfd = kqueue(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1376 Py_END_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1377 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1378 else { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1379 self->kqfd = fd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1380 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1381 if (self->kqfd < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1382 Py_DECREF(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1383 PyErr_SetFromErrno(PyExc_IOError); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1384 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1385 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1386 return (PyObject *)self; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1387 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1388 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1389 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1390 kqueue_queue_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1391 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1392 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1393 if ((args != NULL && PyObject_Size(args)) || |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1394 (kwds != NULL && PyObject_Size(kwds))) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1395 PyErr_SetString(PyExc_ValueError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1396 "select.kqueue doesn't accept arguments"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1397 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1398 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1399 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1400 return newKqueue_Object(type, -1); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1401 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1402 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1403 static void |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1404 kqueue_queue_dealloc(kqueue_queue_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1405 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1406 kqueue_queue_internal_close(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1407 Py_TYPE(self)->tp_free(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1408 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1409 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1410 static PyObject* |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1411 kqueue_queue_close(kqueue_queue_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1412 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1413 errno = kqueue_queue_internal_close(self); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1414 if (errno < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1415 PyErr_SetFromErrno(PyExc_IOError); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1416 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1417 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1418 Py_RETURN_NONE; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1419 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1420 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1421 PyDoc_STRVAR(kqueue_queue_close_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1422 "close() -> None\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1423 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1424 Close the kqueue control file descriptor. Further operations on the kqueue\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1425 object will raise an exception."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1426 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1427 static PyObject* |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1428 kqueue_queue_get_closed(kqueue_queue_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1429 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1430 if (self->kqfd < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1431 Py_RETURN_TRUE; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1432 else |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1433 Py_RETURN_FALSE; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1434 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1435 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1436 static PyObject* |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1437 kqueue_queue_fileno(kqueue_queue_Object *self) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1438 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1439 if (self->kqfd < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1440 return kqueue_queue_err_closed(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1441 return PyInt_FromLong(self->kqfd); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1442 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1443 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1444 PyDoc_STRVAR(kqueue_queue_fileno_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1445 "fileno() -> int\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1446 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1447 Return the kqueue control file descriptor."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1448 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1449 static PyObject* |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1450 kqueue_queue_fromfd(PyObject *cls, PyObject *args) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1451 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1452 SOCKET fd; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1453 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1454 if (!PyArg_ParseTuple(args, "i:fromfd", &fd)) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1455 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1456 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1457 return newKqueue_Object((PyTypeObject*)cls, fd); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1458 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1459 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1460 PyDoc_STRVAR(kqueue_queue_fromfd_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1461 "fromfd(fd) -> kqueue\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1462 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1463 Create a kqueue object from a given control fd."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1464 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1465 static PyObject * |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1466 kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1467 { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1468 int nevents = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1469 int gotevents = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1470 int nchanges = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1471 int i = 0; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1472 PyObject *otimeout = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1473 PyObject *ch = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1474 PyObject *it = NULL, *ei = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1475 PyObject *result = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1476 struct kevent *evl = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1477 struct kevent *chl = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1478 struct timespec timeoutspec; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1479 struct timespec *ptimeoutspec; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1480 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1481 if (self->kqfd < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1482 return kqueue_queue_err_closed(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1483 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1484 if (!PyArg_ParseTuple(args, "Oi|O:control", &ch, &nevents, &otimeout)) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1485 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1486 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1487 if (nevents < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1488 PyErr_Format(PyExc_ValueError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1489 "Length of eventlist must be 0 or positive, got %d", |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1490 nchanges); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1491 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1492 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1493 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1494 if (ch != NULL && ch != Py_None) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1495 it = PyObject_GetIter(ch); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1496 if (it == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1497 PyErr_SetString(PyExc_TypeError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1498 "changelist is not iterable"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1499 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1500 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1501 nchanges = PyObject_Size(ch); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1502 if (nchanges < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1503 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1504 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1505 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1506 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1507 if (otimeout == Py_None || otimeout == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1508 ptimeoutspec = NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1509 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1510 else if (PyNumber_Check(otimeout)) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1511 double timeout; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1512 long seconds; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1513 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1514 timeout = PyFloat_AsDouble(otimeout); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1515 if (timeout == -1 && PyErr_Occurred()) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1516 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1517 if (timeout > (double)LONG_MAX) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1518 PyErr_SetString(PyExc_OverflowError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1519 "timeout period too long"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1520 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1521 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1522 if (timeout < 0) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1523 PyErr_SetString(PyExc_ValueError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1524 "timeout must be positive or None"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1525 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1526 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1527 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1528 seconds = (long)timeout; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1529 timeout = timeout - (double)seconds; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1530 timeoutspec.tv_sec = seconds; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1531 timeoutspec.tv_nsec = (long)(timeout * 1E9); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1532 ptimeoutspec = &timeoutspec; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1533 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1534 else { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1535 PyErr_Format(PyExc_TypeError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1536 "timeout argument must be an number " |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1537 "or None, got %.200s", |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1538 Py_TYPE(otimeout)->tp_name); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1539 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1540 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1541 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1542 if (nchanges) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1543 chl = PyMem_New(struct kevent, nchanges); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1544 if (chl == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1545 PyErr_NoMemory(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1546 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1547 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1548 while ((ei = PyIter_Next(it)) != NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1549 if (!kqueue_event_Check(ei)) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1550 Py_DECREF(ei); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1551 PyErr_SetString(PyExc_TypeError, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1552 "changelist must be an iterable of " |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1553 "select.kevent objects"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1554 goto error; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1555 } else { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1556 chl[i] = ((kqueue_event_Object *)ei)->e; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1557 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1558 Py_DECREF(ei); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1559 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1560 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1561 Py_CLEAR(it); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1562 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1563 /* event list */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1564 if (nevents) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1565 evl = PyMem_New(struct kevent, nevents); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1566 if (evl == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1567 PyErr_NoMemory(); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1568 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1569 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1570 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1571 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1572 Py_BEGIN_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1573 gotevents = kevent(self->kqfd, chl, nchanges, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1574 evl, nevents, ptimeoutspec); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1575 Py_END_ALLOW_THREADS |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1576 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1577 if (gotevents == -1) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1578 PyErr_SetFromErrno(PyExc_OSError); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1579 goto error; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1580 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1581 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1582 result = PyList_New(gotevents); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1583 if (result == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1584 goto error; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1585 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1586 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1587 for (i=0; i < gotevents; i++) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1588 kqueue_event_Object *ch; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1589 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1590 ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1591 if (ch == NULL) { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1592 goto error; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1593 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1594 ch->e = evl[i]; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1595 PyList_SET_ITEM(result, i, (PyObject *)ch); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1596 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1597 PyMem_Free(chl); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1598 PyMem_Free(evl); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1599 return result; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1600 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1601 error: |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1602 PyMem_Free(chl); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1603 PyMem_Free(evl); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1604 Py_XDECREF(result); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1605 Py_XDECREF(it); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1606 return NULL; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1607 } |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1608 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1609 PyDoc_STRVAR(kqueue_queue_control_doc, |
|
49241
50b1e55756a5
#3852: fix some select.kqueue and kevent docs.
Georg Brandl <georg@python.org>
parents:
48046
diff
changeset
|
1610 "control(changelist, max_events[, timeout=None]) -> eventlist\n\ |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1611 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1612 Calls the kernel kevent function.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1613 - changelist must be a list of kevent objects describing the changes\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1614 to be made to the kernel's watch list or None.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1615 - max_events lets you specify the maximum number of events that the\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1616 kernel will return.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1617 - timeout is the maximum time to wait in seconds, or else None,\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1618 to wait forever. timeout accepts floats for smaller timeouts, too."); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1619 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1620 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1621 static PyMethodDef kqueue_queue_methods[] = { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1622 {"fromfd", (PyCFunction)kqueue_queue_fromfd, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1623 METH_VARARGS | METH_CLASS, kqueue_queue_fromfd_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1624 {"close", (PyCFunction)kqueue_queue_close, METH_NOARGS, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1625 kqueue_queue_close_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1626 {"fileno", (PyCFunction)kqueue_queue_fileno, METH_NOARGS, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1627 kqueue_queue_fileno_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1628 {"control", (PyCFunction)kqueue_queue_control, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1629 METH_VARARGS , kqueue_queue_control_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1630 {NULL, NULL}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1631 }; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1632 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1633 static PyGetSetDef kqueue_queue_getsetlist[] = { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1634 {"closed", (getter)kqueue_queue_get_closed, NULL, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1635 "True if the kqueue handler is closed"}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1636 {0}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1637 }; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1638 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1639 PyDoc_STRVAR(kqueue_queue_doc, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1640 "Kqueue syscall wrapper.\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1641 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1642 For example, to start watching a socket for input:\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1643 >>> kq = kqueue()\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1644 >>> sock = socket()\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1645 >>> sock.connect((host, port))\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1646 >>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_ADD)], 0)\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1647 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1648 To wait one second for it to become writeable:\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1649 >>> kq.control(None, 1, 1000)\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1650 \n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1651 To stop listening:\n\ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1652 >>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_DELETE)], 0)"); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1653 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1654 static PyTypeObject kqueue_queue_Type = { |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1655 PyVarObject_HEAD_INIT(NULL, 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1656 "select.kqueue", /* tp_name */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1657 sizeof(kqueue_queue_Object), /* tp_basicsize */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1658 0, /* tp_itemsize */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1659 (destructor)kqueue_queue_dealloc, /* tp_dealloc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1660 0, /* tp_print */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1661 0, /* tp_getattr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1662 0, /* tp_setattr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1663 0, /* tp_compare */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1664 0, /* tp_repr */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1665 0, /* tp_as_number */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1666 0, /* tp_as_sequence */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1667 0, /* tp_as_mapping */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1668 0, /* tp_hash */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1669 0, /* tp_call */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1670 0, /* tp_str */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1671 0, /* tp_getattro */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1672 0, /* tp_setattro */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1673 0, /* tp_as_buffer */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1674 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1675 kqueue_queue_doc, /* tp_doc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1676 0, /* tp_traverse */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1677 0, /* tp_clear */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1678 0, /* tp_richcompare */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1679 0, /* tp_weaklistoffset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1680 0, /* tp_iter */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1681 0, /* tp_iternext */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1682 kqueue_queue_methods, /* tp_methods */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1683 0, /* tp_members */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1684 kqueue_queue_getsetlist, /* tp_getset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1685 0, /* tp_base */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1686 0, /* tp_dict */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1687 0, /* tp_descr_get */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1688 0, /* tp_descr_set */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1689 0, /* tp_dictoffset */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1690 0, /* tp_init */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1691 0, /* tp_alloc */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1692 kqueue_queue_new, /* tp_new */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1693 0, /* tp_free */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1694 }; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1695 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1696 #endif /* HAVE_KQUEUE */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1697 /* ************************************************************************ */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1698 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
1699 PyDoc_STRVAR(select_doc, |
| 8570 | 1700 "select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\ |
| 1701 \n\ | |
| 1702 Wait until one or more file descriptors are ready for some kind of I/O.\n\ | |
|
30402
a430be683a7a
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
Brett Cannon <bcannon@gmail.com>
parents:
27815
diff
changeset
|
1703 The first three arguments are sequences of file descriptors to be waited for:\n\ |
| 8570 | 1704 rlist -- wait until ready for reading\n\ |
| 1705 wlist -- wait until ready for writing\n\ | |
| 1706 xlist -- wait for an ``exceptional condition''\n\ | |
| 1707 If only one kind of condition is required, pass [] for the other lists.\n\ | |
| 1708 A file descriptor is either a socket or file object, or a small integer\n\ | |
| 1709 gotten from a fileno() method call on one of those.\n\ | |
| 1710 \n\ | |
| 1711 The optional 4th argument specifies a timeout in seconds; it may be\n\ | |
| 1712 a floating point number to specify fractions of seconds. If it is absent\n\ | |
| 1713 or None, the call will never time out.\n\ | |
| 1714 \n\ | |
| 1715 The return value is a tuple of three lists corresponding to the first three\n\ | |
| 1716 arguments; each contains the subset of the corresponding file descriptors\n\ | |
| 1717 that are ready.\n\ | |
| 1718 \n\ | |
| 1719 *** IMPORTANT NOTICE ***\n\ | |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1720 On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\ |
| 46094 | 1721 descriptors can be used."); |
| 8570 | 1722 |
|
4692
cb405b9696d4
Several changes... Guido *please* take a look!
Barry Warsaw <barry@python.org>
parents:
4621
diff
changeset
|
1723 static PyMethodDef select_methods[] = { |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1724 {"select", select_select, METH_VARARGS, select_doc}, |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1725 #ifdef HAVE_POLL |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1726 {"poll", select_poll, METH_NOARGS, poll_doc}, |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1727 #endif /* HAVE_POLL */ |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1728 {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
|
1729 }; |
|
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1730 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23607
diff
changeset
|
1731 PyDoc_STRVAR(module_doc, |
| 8570 | 1732 "This module supports asynchronous I/O on multiple file descriptors.\n\ |
| 1733 \n\ | |
| 1734 *** IMPORTANT NOTICE ***\n\ | |
|
39043
c67b23397f30
Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38716
diff
changeset
|
1735 On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors."); |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1736 |
|
24363
979ff5d0ae07
Replace DL_IMPORT with PyMODINIT_FUNC and remove "/export:init..." link
Mark Hammond <mhammond@skippinet.com.au>
parents:
24283
diff
changeset
|
1737 PyMODINIT_FUNC |
|
13651
8a063423e0b7
Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents:
13593
diff
changeset
|
1738 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
|
1739 { |
|
22729
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22114
diff
changeset
|
1740 PyObject *m; |
| 8570 | 1741 m = Py_InitModule3("select", select_methods, module_doc); |
|
36324
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35834
diff
changeset
|
1742 if (m == NULL) |
|
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35834
diff
changeset
|
1743 return; |
|
22729
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22114
diff
changeset
|
1744 |
|
6367
2c29b8982643
Apply two changes, systematically:
Guido van Rossum <guido@python.org>
parents:
4734
diff
changeset
|
1745 SelectError = PyErr_NewException("select.error", NULL, NULL); |
|
22729
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22114
diff
changeset
|
1746 Py_INCREF(SelectError); |
|
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22114
diff
changeset
|
1747 PyModule_AddObject(m, "error", SelectError); |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1748 |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1749 #if defined(HAVE_POLL) |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1750 #ifdef __APPLE__ |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1751 if (select_have_broken_poll()) { |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1752 if (PyObject_DelAttrString(m, "poll") == -1) { |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1753 PyErr_Clear(); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1754 } |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1755 } else { |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1756 #else |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1757 { |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1758 #endif |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
42333
diff
changeset
|
1759 Py_TYPE(&poll_Type) = &PyType_Type; |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1760 PyModule_AddIntConstant(m, "POLLIN", POLLIN); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1761 PyModule_AddIntConstant(m, "POLLPRI", POLLPRI); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1762 PyModule_AddIntConstant(m, "POLLOUT", POLLOUT); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1763 PyModule_AddIntConstant(m, "POLLERR", POLLERR); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1764 PyModule_AddIntConstant(m, "POLLHUP", POLLHUP); |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1765 PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL); |
|
14174
35b7989ba20c
Add interface to poll() system call (SF patch #100852)
Andrew M. Kuchling <amk@amk.ca>
parents:
13761
diff
changeset
|
1766 |
|
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
|
1767 #ifdef POLLRDNORM |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1768 PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM); |
|
14918
914ae7f9c64c
Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents:
14869
diff
changeset
|
1769 #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
|
1770 #ifdef POLLRDBAND |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1771 PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND); |
|
14918
914ae7f9c64c
Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents:
14869
diff
changeset
|
1772 #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
|
1773 #ifdef POLLWRNORM |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1774 PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM); |
|
14918
914ae7f9c64c
Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents:
14869
diff
changeset
|
1775 #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
|
1776 #ifdef POLLWRBAND |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1777 PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND); |
|
14918
914ae7f9c64c
Add #ifdef's for platforms that don't have the constants POLLRDNORM and
Andrew M. Kuchling <amk@amk.ca>
parents:
14869
diff
changeset
|
1778 #endif |
|
14182
c85a80db6845
Not every OS that support poll seems to support POLLMSG.
Sjoerd Mullender <sjoerd@acm.org>
parents:
14174
diff
changeset
|
1779 #ifdef POLLMSG |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1780 PyModule_AddIntConstant(m, "POLLMSG", POLLMSG); |
|
14182
c85a80db6845
Not every OS that support poll seems to support POLLMSG.
Sjoerd Mullender <sjoerd@acm.org>
parents:
14174
diff
changeset
|
1781 #endif |
|
37935
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1782 } |
|
e3a8a8de355e
Patch 1471761 - test for broken poll at runtime
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
36501
diff
changeset
|
1783 #endif /* HAVE_POLL */ |
|
45991
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1784 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1785 #ifdef HAVE_EPOLL |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1786 Py_TYPE(&pyEpoll_Type) = &PyType_Type; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1787 if (PyType_Ready(&pyEpoll_Type) < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1788 return; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1789 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1790 Py_INCREF(&pyEpoll_Type); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1791 PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1792 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1793 PyModule_AddIntConstant(m, "EPOLLIN", EPOLLIN); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1794 PyModule_AddIntConstant(m, "EPOLLOUT", EPOLLOUT); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1795 PyModule_AddIntConstant(m, "EPOLLPRI", EPOLLPRI); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1796 PyModule_AddIntConstant(m, "EPOLLERR", EPOLLERR); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1797 PyModule_AddIntConstant(m, "EPOLLHUP", EPOLLHUP); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1798 PyModule_AddIntConstant(m, "EPOLLET", EPOLLET); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1799 #ifdef EPOLLONESHOT |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1800 /* Kernel 2.6.2+ */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1801 PyModule_AddIntConstant(m, "EPOLLONESHOT", EPOLLONESHOT); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1802 #endif |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1803 /* PyModule_AddIntConstant(m, "EPOLL_RDHUP", EPOLLRDHUP); */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1804 PyModule_AddIntConstant(m, "EPOLLRDNORM", EPOLLRDNORM); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1805 PyModule_AddIntConstant(m, "EPOLLRDBAND", EPOLLRDBAND); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1806 PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1807 PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1808 PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1809 #endif /* HAVE_EPOLL */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1810 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1811 #ifdef HAVE_KQUEUE |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1812 kqueue_event_Type.tp_new = PyType_GenericNew; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1813 Py_TYPE(&kqueue_event_Type) = &PyType_Type; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1814 if(PyType_Ready(&kqueue_event_Type) < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1815 return; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1816 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1817 Py_INCREF(&kqueue_event_Type); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1818 PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1819 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1820 Py_TYPE(&kqueue_queue_Type) = &PyType_Type; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1821 if(PyType_Ready(&kqueue_queue_Type) < 0) |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1822 return; |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1823 Py_INCREF(&kqueue_queue_Type); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1824 PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1825 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1826 /* event filters */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1827 PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1828 PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1829 PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1830 PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1831 PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1832 #ifdef EVFILT_NETDEV |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1833 PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1834 #endif |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1835 PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1836 PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1837 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1838 /* event flags */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1839 PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1840 PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1841 PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1842 PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1843 PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1844 PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1845 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1846 PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1847 PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1848 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1849 PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1850 PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1851 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1852 /* READ WRITE filter flag */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1853 PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1854 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1855 /* VNODE filter flags */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1856 PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1857 PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1858 PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1859 PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1860 PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1861 PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1862 PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1863 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1864 /* PROC filter flags */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1865 PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1866 PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1867 PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1868 PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1869 PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1870 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1871 PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1872 PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1873 PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1874 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1875 /* NETDEV filter flags */ |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1876 #ifdef EVFILT_NETDEV |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1877 PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1878 PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1879 PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV); |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1880 #endif |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1881 |
|
728dc13327b2
Applied patch #1657 epoll and kqueue wrappers for the select module
Christian Heimes <christian@cheimes.de>
parents:
44350
diff
changeset
|
1882 #endif /* HAVE_KQUEUE */ |
|
902
a4793ae26682
Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1883 } |
