Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion Doc/library/select.rst
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,16 @@ The module defines the following:

(Only supported on Linux 2.5.44 and newer.) Return an edge polling object,
which can be used as Edge or Level Triggered interface for I/O
events. *sizehint* and *flags* are deprecated and completely ignored.
events.

*sizehint* informs epoll about the expected number of events to be
registered. It must be positive, or `-1` to use the default. It is only
used on older systems where :c:func:`epoll_create1` is not available;
otherwise it has no effect (though its value is still checked).

*flags* is deprecated and completely ignored. However, when supplied, its
value must be ``0`` or ``select.EPOLL_CLOEXEC``, otherwise ``OSError`` is
raised.

See the :ref:`epoll-objects` section below for the methods supported by
epolling objects.
Expand Down
25 changes: 16 additions & 9 deletions Lib/test/test_epoll.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@ def test_create(self):
ep.close()
self.assertTrue(ep.closed)
self.assertRaises(ValueError, ep.fileno)

if hasattr(select, "EPOLL_CLOEXEC"):
select.epoll(select.EPOLL_CLOEXEC).close()
select.epoll(-1, select.EPOLL_CLOEXEC).close()
select.epoll(flags=select.EPOLL_CLOEXEC).close()
select.epoll(flags=0).close()
self.assertRaises(OSError, select.epoll, flags=12356)

def test_badcreate(self):
self.assertRaises(TypeError, select.epoll, 1, 2, 3)
Expand All @@ -88,6 +88,13 @@ def test_badcreate(self):
self.assertRaises(TypeError, select.epoll, ['foo'])
self.assertRaises(TypeError, select.epoll, {})

self.assertRaises(ValueError, select.epoll, 0)
self.assertRaises(ValueError, select.epoll, -2)
self.assertRaises(ValueError, select.epoll, sizehint=-2)

if hasattr(select, "EPOLL_CLOEXEC"):
self.assertRaises(OSError, select.epoll, flags=12356)

def test_context_manager(self):
with select.epoll(16) as ep:
self.assertGreater(ep.fileno(), 0)
Expand Down Expand Up @@ -117,19 +124,19 @@ def test_add(self):
try:
# TypeError: argument must be an int, or have a fileno() method.
self.assertRaises(TypeError, ep.register, object(),
select.EPOLLIN | select.EPOLLOUT)
select.EPOLLIN | select.EPOLLOUT)
self.assertRaises(TypeError, ep.register, None,
select.EPOLLIN | select.EPOLLOUT)
select.EPOLLIN | select.EPOLLOUT)
# ValueError: file descriptor cannot be a negative integer (-1)
self.assertRaises(ValueError, ep.register, -1,
select.EPOLLIN | select.EPOLLOUT)
select.EPOLLIN | select.EPOLLOUT)
# OSError: [Errno 9] Bad file descriptor
self.assertRaises(OSError, ep.register, 10000,
select.EPOLLIN | select.EPOLLOUT)
select.EPOLLIN | select.EPOLLOUT)
# registering twice also raises an exception
ep.register(server, select.EPOLLIN | select.EPOLLOUT)
self.assertRaises(OSError, ep.register, server,
select.EPOLLIN | select.EPOLLOUT)
select.EPOLLIN | select.EPOLLOUT)
finally:
ep.close()

Expand Down Expand Up @@ -160,9 +167,9 @@ def test_control_and_wait(self):

ep = select.epoll(16)
ep.register(server.fileno(),
select.EPOLLIN | select.EPOLLOUT | select.EPOLLET)
select.EPOLLIN | select.EPOLLOUT | select.EPOLLET)
ep.register(client.fileno(),
select.EPOLLIN | select.EPOLLOUT | select.EPOLLET)
select.EPOLLIN | select.EPOLLOUT | select.EPOLLET)

now = time.monotonic()
events = ep.poll(1, 4)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Make select.epoll() and its documentation consistent regarding *sizehint* and
*flags*.
10 changes: 6 additions & 4 deletions Modules/selectmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1297,14 +1297,17 @@ newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
static PyObject *
pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
int flags = 0, sizehint = FD_SETSIZE - 1;
int flags = 0, sizehint = -1;
static char *kwlist[] = {"sizehint", "flags", NULL};

if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:epoll", kwlist,
&sizehint, &flags))
return NULL;
if (sizehint < 0) {
PyErr_SetString(PyExc_ValueError, "negative sizehint");
if (sizehint == -1) {
sizehint = FD_SETSIZE - 1;
}
else if (sizehint <= 0) {
PyErr_SetString(PyExc_ValueError, "sizehint must be positive or -1");
return NULL;
}

Expand All @@ -1314,7 +1317,6 @@ pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
#endif

return newPyEpoll_Object(type, sizehint, -1);
}

Expand Down