From 95c16629d3549e7306d297ed09e26e58b151f720 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 27 Dec 2011 15:36:32 -0600 Subject: [PATCH] fix for old kernels which don't have epoll_create1 --- Modules/selectmodule.c | 12 +++++++++--- configure | 29 +++++++++++++++++++++++++++-- configure.in | 6 ++++++ pyconfig.h.in | 3 +++ 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 6e3e6cbf1d5..a8413fede5c 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -1087,7 +1087,7 @@ pyepoll_internal_close(pyEpoll_Object *self) } static PyObject * -newPyEpoll_Object(PyTypeObject *type, int flags, SOCKET fd) +newPyEpoll_Object(PyTypeObject *type, int sizehint, int flags, SOCKET fd) { pyEpoll_Object *self; @@ -1098,7 +1098,11 @@ newPyEpoll_Object(PyTypeObject *type, int flags, SOCKET fd) if (fd == -1) { Py_BEGIN_ALLOW_THREADS +#ifdef HAVE_EPOLL_CREATE1 self->epfd = epoll_create1(flags); +#else + self->epfd = epoll_create(sizehint); +#endif Py_END_ALLOW_THREADS } else { @@ -1127,7 +1131,7 @@ pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } - return newPyEpoll_Object(type, flags, -1); + return newPyEpoll_Object(type, sizehint, flags, -1); } @@ -1185,7 +1189,7 @@ pyepoll_fromfd(PyObject *cls, PyObject *args) if (!PyArg_ParseTuple(args, "i:fromfd", &fd)) return NULL; - return newPyEpoll_Object((PyTypeObject*)cls, 0, fd); + return newPyEpoll_Object((PyTypeObject*)cls, FD_SETSIZE - 1, 0, fd); } PyDoc_STRVAR(pyepoll_fromfd_doc, @@ -2213,7 +2217,9 @@ PyInit_select(void) PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND); PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG); +#ifdef EPOLL_CLOEXEC PyModule_AddIntConstant(m, "EPOLL_CLOEXEC", EPOLL_CLOEXEC); +#endif #endif /* HAVE_EPOLL */ #ifdef HAVE_KQUEUE diff --git a/configure b/configure index 455e62a87f3..7cd7e918732 100755 --- a/configure +++ b/configure @@ -9604,6 +9604,31 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for epoll_create1" >&5 +$as_echo_n "checking for epoll_create1... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +void *x=epoll_create1 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_EPOLL_CREATE1 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kqueue" >&5 @@ -14564,8 +14589,8 @@ esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. -config_files="`echo $ac_config_files`" -config_headers="`echo $ac_config_headers`" +config_files="$ac_config_files" +config_headers="$ac_config_headers" _ACEOF diff --git a/configure.in b/configure.in index 95fb8c5dddc..b7eccb71361 100644 --- a/configure.in +++ b/configure.in @@ -2628,6 +2628,12 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[void *x=epoll_c AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for epoll_create1) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[void *x=epoll_create1]])], + [AC_DEFINE(HAVE_EPOLL_CREATE1, 1, Define if you have the 'epoll_create1' function.) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) +]) AC_MSG_CHECKING(for kqueue) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include diff --git a/pyconfig.h.in b/pyconfig.h.in index 6b497217d6c..accc8938b06 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -196,6 +196,9 @@ /* Define if you have the 'epoll' functions. */ #undef HAVE_EPOLL +/* Define if you have the 'epoll_create1' function. */ +#undef HAVE_EPOLL_CREATE1 + /* Define to 1 if you have the `erf' function. */ #undef HAVE_ERF