From 2fb9ae9dfc5a6830d902332ba93b13387e292ddb Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 27 Dec 2011 15:15:41 -0600 Subject: [PATCH] add a flags parameter to select.epoll --- Doc/library/select.rst | 17 ++++++++++++----- Lib/test/test_epoll.py | 2 ++ Misc/NEWS | 2 ++ Modules/selectmodule.c | 34 +++++++++++++++------------------- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/Doc/library/select.rst b/Doc/library/select.rst index 72fba732e42..d9d802bb42c 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -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() diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py index 275e59834cc..b899b6e26da 100644 --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index 1dc721af9e5..43e2637cb36 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 5d5e77248ac..6e3e6cbf1d5 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -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