.. 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()
}
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)
if (fd == -1) {
Py_BEGIN_ALLOW_THREADS
- self->epfd = epoll_create(sizehint);
+ self->epfd = epoll_create1(flags);
Py_END_ALLOW_THREADS
}
else {
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);
}
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,
};
PyDoc_STRVAR(pyepoll_doc,
-"select.epoll([sizehint=-1])\n\
+"select.epoll(sizehint=-1, flags=0)\n\
\n\
Returns an epolling object\n\
\n\
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