diff options
author | Charles-François Natali <cf.natali@gmail.com> | 2013-01-12 11:31:00 (GMT) |
---|---|---|
committer | Charles-François Natali <cf.natali@gmail.com> | 2013-01-12 11:31:00 (GMT) |
commit | a6ebb2d7fbbd943f4f8f1798894c6d7ca5615f2a (patch) | |
tree | a67b91530c7f586c0ab022fd8a182b63548d4b17 /Modules/selectmodule.c | |
parent | e6f3d531381c3ab983ce7bb81055721303b792f1 (diff) | |
download | cpython-a6ebb2d7fbbd943f4f8f1798894c6d7ca5615f2a.zip cpython-a6ebb2d7fbbd943f4f8f1798894c6d7ca5615f2a.tar.gz cpython-a6ebb2d7fbbd943f4f8f1798894c6d7ca5615f2a.tar.bz2 |
Issue #16876: Revert be8e6b81284e, which wasn't thread-safe: wait until a
solution is found for poll().
Diffstat (limited to 'Modules/selectmodule.c')
-rw-r--r-- | Modules/selectmodule.c | 45 |
1 files changed, 13 insertions, 32 deletions
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 466f980..52be4d8 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -1056,14 +1056,9 @@ static int select_have_broken_poll(void) #include <sys/epoll.h> #endif -/* default maximum number of events returned by epoll_wait() */ -#define EPOLL_DEFAULT_MAXEVENTS (FD_SETSIZE) - typedef struct { PyObject_HEAD - SOCKET epfd; /* epoll control file descriptor */ - int maxevents; /* maximum number of epoll events */ - struct epoll_event *evs; /* epoll events buffer */ + SOCKET epfd; /* epoll control file descriptor */ } pyEpoll_Object; static PyTypeObject pyEpoll_Type; @@ -1119,15 +1114,6 @@ newPyEpoll_Object(PyTypeObject *type, int sizehint, int flags, SOCKET fd) PyErr_SetFromErrno(PyExc_OSError); return NULL; } - - self->maxevents = EPOLL_DEFAULT_MAXEVENTS; - self->evs = PyMem_New(struct epoll_event, self->maxevents); - if (!self->evs) { - Py_DECREF(self); - PyErr_NoMemory(); - return NULL; - } - return (PyObject *)self; } @@ -1154,10 +1140,6 @@ static void pyepoll_dealloc(pyEpoll_Object *self) { (void)pyepoll_internal_close(self); - if (self->evs) { - PyMem_Free(self->evs); - self->evs = NULL; - } Py_TYPE(self)->tp_free(self); } @@ -1338,6 +1320,7 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds) int maxevents = -1; int nfds, i; PyObject *elist = NULL, *etuple = NULL; + struct epoll_event *evs = NULL; static char *kwlist[] = {"timeout", "maxevents", NULL}; if (self->epfd < 0) @@ -1361,27 +1344,24 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds) } if (maxevents == -1) { - maxevents = EPOLL_DEFAULT_MAXEVENTS; - } else if (maxevents < 1) { + maxevents = FD_SETSIZE-1; + } + else if (maxevents < 1) { PyErr_Format(PyExc_ValueError, "maxevents must be greater than 0, got %d", maxevents); return NULL; } - if (maxevents > self->maxevents) { - struct epoll_event *orig_evs = self->evs; - PyMem_RESIZE(self->evs, struct epoll_event, maxevents); - if (!self->evs) { - self->evs = orig_evs; - PyErr_NoMemory(); - return NULL; - } - self->maxevents = maxevents; + evs = PyMem_New(struct epoll_event, maxevents); + if (evs == NULL) { + Py_DECREF(self); + PyErr_NoMemory(); + return NULL; } Py_BEGIN_ALLOW_THREADS - nfds = epoll_wait(self->epfd, self->evs, self->maxevents, timeout); + nfds = epoll_wait(self->epfd, evs, maxevents, timeout); Py_END_ALLOW_THREADS if (nfds < 0) { PyErr_SetFromErrno(PyExc_OSError); @@ -1394,7 +1374,7 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds) } for (i = 0; i < nfds; i++) { - etuple = Py_BuildValue("iI", self->evs[i].data.fd, self->evs[i].events); + etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events); if (etuple == NULL) { Py_CLEAR(elist); goto error; @@ -1403,6 +1383,7 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds) } error: + PyMem_Free(evs); return elist; } |