add a flags parameter to select.epoll

This commit is contained in:
Benjamin Peterson 2011-12-27 15:15:41 -06:00
parent e7437a7cb3
commit 2fb9ae9dfc
4 changed files with 31 additions and 24 deletions

View File

@ -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()

View File

@ -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)

View File

@ -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

View File

@ -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