fix for old kernels which don't have epoll_create1

This commit is contained in:
Benjamin Peterson 2011-12-27 15:36:32 -06:00
parent a5f6f2aba3
commit 95c16629d3
4 changed files with 45 additions and 5 deletions

View File

@ -1087,7 +1087,7 @@ pyepoll_internal_close(pyEpoll_Object *self)
} }
static PyObject * static PyObject *
newPyEpoll_Object(PyTypeObject *type, int flags, SOCKET fd) newPyEpoll_Object(PyTypeObject *type, int sizehint, int flags, SOCKET fd)
{ {
pyEpoll_Object *self; pyEpoll_Object *self;
@ -1098,7 +1098,11 @@ newPyEpoll_Object(PyTypeObject *type, int flags, SOCKET fd)
if (fd == -1) { if (fd == -1) {
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
#ifdef HAVE_EPOLL_CREATE1
self->epfd = epoll_create1(flags); self->epfd = epoll_create1(flags);
#else
self->epfd = epoll_create(sizehint);
#endif
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
} }
else { else {
@ -1127,7 +1131,7 @@ pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL; 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)) if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
return NULL; return NULL;
return newPyEpoll_Object((PyTypeObject*)cls, 0, fd); return newPyEpoll_Object((PyTypeObject*)cls, FD_SETSIZE - 1, 0, fd);
} }
PyDoc_STRVAR(pyepoll_fromfd_doc, PyDoc_STRVAR(pyepoll_fromfd_doc,
@ -2213,7 +2217,9 @@ PyInit_select(void)
PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND); PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG); PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
#ifdef EPOLL_CLOEXEC
PyModule_AddIntConstant(m, "EPOLL_CLOEXEC", EPOLL_CLOEXEC); PyModule_AddIntConstant(m, "EPOLL_CLOEXEC", EPOLL_CLOEXEC);
#endif
#endif /* HAVE_EPOLL */ #endif /* HAVE_EPOLL */
#ifdef HAVE_KQUEUE #ifdef HAVE_KQUEUE

29
configure vendored
View File

@ -9604,6 +9604,31 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $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 <sys/epoll.h>
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 fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for kqueue" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kqueue" >&5
@ -14564,8 +14589,8 @@ esac
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for. # Files that config.status was made for.
config_files="`echo $ac_config_files`" config_files="$ac_config_files"
config_headers="`echo $ac_config_headers`" config_headers="$ac_config_headers"
_ACEOF _ACEOF

View File

@ -2628,6 +2628,12 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/epoll.h>]], [[void *x=epoll_c
AC_MSG_RESULT(yes)], AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no) [AC_MSG_RESULT(no)
]) ])
AC_MSG_CHECKING(for epoll_create1)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/epoll.h>]], [[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_MSG_CHECKING(for kqueue)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/types.h> #include <sys/types.h>

View File

@ -196,6 +196,9 @@
/* Define if you have the 'epoll' functions. */ /* Define if you have the 'epoll' functions. */
#undef HAVE_EPOLL #undef HAVE_EPOLL
/* Define if you have the 'epoll_create1' function. */
#undef HAVE_EPOLL_CREATE1
/* Define to 1 if you have the `erf' function. */ /* Define to 1 if you have the `erf' function. */
#undef HAVE_ERF #undef HAVE_ERF