Commit 2fb9ae9d authored by Benjamin Peterson's avatar Benjamin Peterson

add a flags parameter to select.epoll

parent e7437a7c
......@@ -39,12 +39,19 @@ The module defines the following:
.. versionadded:: 3.3
.. function:: epoll(sizehint=-1)
.. function:: epoll(sizehint=-1, flags=0)
(Only supported on Linux 2.5.44 and newer.) Returns an edge polling object,
which can be used as Edge or Level Triggered interface for I/O events; see
section :ref:`epoll-objects` below for the methods supported by epolling
objects.
(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* is deprecated and completely ignored. *flags* can be set
to :const:`EPOLL_CLOEXEC`, which causes the epoll descriptor to be closed
automatically when :func:`os.execve` is called. See section
:ref:`epoll-objects` below for the methods supported by epolling objects.
.. versionchanged:: 3.3
Added the *flags* parameter.
.. function:: poll()
......
......@@ -74,6 +74,8 @@ class TestEPoll(unittest.TestCase):
ep.close()
self.assertTrue(ep.closed)
self.assertRaises(ValueError, ep.fileno)
select.epoll(select.EPOLL_CLOEXEC).close()
self.assertRaises(OSError, select.epoll, flags=12356)
def test_badcreate(self):
self.assertRaises(TypeError, select.epoll, 1, 2, 3)
......
......@@ -422,6 +422,8 @@ Core and Builtins
Library
-------
- Add a flags parameter to select.epoll.
- Issue #12798: Updated the mimetypes documentation.
- Issue #13626: Add support for SSL Diffie-Hellman key exchange, through the
......
......@@ -1087,20 +1087,10 @@ pyepoll_internal_close(pyEpoll_Object *self)
}
static PyObject *
newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
newPyEpoll_Object(PyTypeObject *type, int flags, SOCKET fd)
{
pyEpoll_Object *self;
if (sizehint == -1) {
sizehint = FD_SETSIZE-1;
}
else if (sizehint < 1) {
PyErr_Format(PyExc_ValueError,
"sizehint must be greater zero, got %d",
sizehint);
return NULL;
}
assert(type != NULL && type->tp_alloc != NULL);
self = (pyEpoll_Object *) type->tp_alloc(type, 0);
if (self == NULL)
......@@ -1108,7 +1098,7 @@ newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
if (fd == -1) {
Py_BEGIN_ALLOW_THREADS
self->epfd = epoll_create(sizehint);
self->epfd = epoll_create1(flags);
Py_END_ALLOW_THREADS
}
else {
......@@ -1126,14 +1116,18 @@ newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
static PyObject *
pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
int sizehint = -1;
static char *kwlist[] = {"sizehint", NULL};
int flags = 0, sizehint = 0;
static char *kwlist[] = {"sizehint", "flags", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist,
&sizehint))
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:epoll", kwlist,
&sizehint, &flags))
return NULL;
if (sizehint < 0) {
PyErr_SetString(PyExc_ValueError, "negative sizehint");
return NULL;
}
return newPyEpoll_Object(type, sizehint, -1);
return newPyEpoll_Object(type, flags, -1);
}
......@@ -1191,7 +1185,7 @@ pyepoll_fromfd(PyObject *cls, PyObject *args)
if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
return NULL;
return newPyEpoll_Object((PyTypeObject*)cls, -1, fd);
return newPyEpoll_Object((PyTypeObject*)cls, 0, fd);
}
PyDoc_STRVAR(pyepoll_fromfd_doc,
......@@ -1420,7 +1414,7 @@ static PyGetSetDef pyepoll_getsetlist[] = {
};
PyDoc_STRVAR(pyepoll_doc,
"select.epoll([sizehint=-1])\n\
"select.epoll(sizehint=-1, flags=0)\n\
\n\
Returns an epolling object\n\
\n\
......@@ -2218,6 +2212,8 @@ PyInit_select(void)
PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
PyModule_AddIntConstant(m, "EPOLL_CLOEXEC", EPOLL_CLOEXEC);
#endif /* HAVE_EPOLL */
#ifdef HAVE_KQUEUE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment