From e62c5c88f179e5f6b445e40603ef7b7b2e706be9 Mon Sep 17 00:00:00 2001 From: Nicholas Bastin Date: Sun, 21 Mar 2004 23:45:42 +0000 Subject: [PATCH] Added configure check for broken poll() on some unix systems (MacOS X 10.3) Fixes SF Bug #850981 --- Modules/selectmodule.c | 12 +++---- configure | 74 +++++++++++++++++++++++++++++++++++++++++- configure.in | 37 +++++++++++++++++++++ pyconfig.h.in | 12 +++++++ 4 files changed, 128 insertions(+), 7 deletions(-) diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 989885a2558..26b918e3cea 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -318,7 +318,7 @@ select_select(PyObject *self, PyObject *args) return ret; } -#ifdef HAVE_POLL +#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) /* * poll() support */ @@ -612,7 +612,7 @@ select_poll(PyObject *self, PyObject *args) return NULL; return (PyObject *)rv; } -#endif /* HAVE_POLL */ +#endif /* HAVE_POLL && !HAVE_BROKEN_POLL */ PyDoc_STRVAR(select_doc, "select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\ @@ -639,9 +639,9 @@ On Windows, only sockets are supported; on Unix, all file descriptors."); static PyMethodDef select_methods[] = { {"select", select_select, METH_VARARGS, select_doc}, -#ifdef HAVE_POLL +#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) {"poll", select_poll, METH_VARARGS, poll_doc}, -#endif /* HAVE_POLL */ +#endif /* HAVE_POLL && !HAVE_BROKEN_POLL */ {0, 0}, /* sentinel */ }; @@ -660,7 +660,7 @@ initselect(void) SelectError = PyErr_NewException("select.error", NULL, NULL); Py_INCREF(SelectError); PyModule_AddObject(m, "error", SelectError); -#ifdef HAVE_POLL +#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) poll_Type.ob_type = &PyType_Type; PyModule_AddIntConstant(m, "POLLIN", POLLIN); PyModule_AddIntConstant(m, "POLLPRI", POLLPRI); @@ -684,5 +684,5 @@ initselect(void) #ifdef POLLMSG PyModule_AddIntConstant(m, "POLLMSG", POLLMSG); #endif -#endif /* HAVE_POLL */ +#endif /* HAVE_POLL && !HAVE_BROKEN_POLL */ } diff --git a/configure b/configure index cf2747a7599..14411a6744e 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 1.451 . +# From configure.in Revision: 1.452 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.57 for python 2.4. # @@ -17577,6 +17577,78 @@ _ACEOF fi +echo "$as_me:$LINENO: checking for broken poll()" >&5 +echo $ECHO_N "checking for broken poll()... $ECHO_C" >&6 +if test "$cross_compiling" = yes; then + ac_cv_broken_poll=no +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +int main (void) + { + struct pollfd poll_struct = { 42, POLLIN|POLLPRI|POLLOUT, 0 }; + + close (42); + + int poll_test = poll (&poll_struct, 1, 0); + + if (poll_test < 0) + { + exit(0); + } + else if (poll_test == 0 && poll_struct.revents != POLLNVAL) + { + exit(0); + } + else + { + exit(1); + } + } + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_broken_poll=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_broken_poll=no +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_broken_poll" >&5 +echo "${ECHO_T}$ac_cv_broken_poll" >&6 +if test "$ac_cv_broken_poll" = yes +then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_BROKEN_POLL 1 +_ACEOF + +fi + + # tzset(3) exists and works like we expect it to echo "$as_me:$LINENO: checking for working tzset()" >&5 echo $ECHO_N "checking for working tzset()... $ECHO_C" >&6 diff --git a/configure.in b/configure.in index e5495bda502..46e290a1099 100644 --- a/configure.in +++ b/configure.in @@ -2765,6 +2765,43 @@ then [Define if nice() returns success/failure instead of the new priority.]) fi +AC_MSG_CHECKING(for broken poll()) +AC_TRY_RUN([ +#include + +int main (void) + { + struct pollfd poll_struct = { 42, POLLIN|POLLPRI|POLLOUT, 0 }; + + close (42); + + int poll_test = poll (&poll_struct, 1, 0); + + if (poll_test < 0) + { + exit(0); + } + else if (poll_test == 0 && poll_struct.revents != POLLNVAL) + { + exit(0); + } + else + { + exit(1); + } + } +], +ac_cv_broken_poll=yes, +ac_cv_broken_poll=no, +ac_cv_broken_poll=no) +AC_MSG_RESULT($ac_cv_broken_poll) +if test "$ac_cv_broken_poll" = yes +then + AC_DEFINE(HAVE_BROKEN_POLL, 1, + [Define if poll() sets errno on invalid file descriptors.]) +fi + + # tzset(3) exists and works like we expect it to AC_MSG_CHECKING(for working tzset()) AC_CACHE_VAL(ac_cv_working_tzset, [ diff --git a/pyconfig.h.in b/pyconfig.h.in index e42f807167f..fd4a1240832 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -46,6 +46,9 @@ /* Define if nice() returns success/failure instead of the new priority. */ #undef HAVE_BROKEN_NICE +/* Define if poll() sets errno on invalid file descriptors. */ +#undef HAVE_BROKEN_POLL + /* Define if the Posix semaphores do not work on your system */ #undef HAVE_BROKEN_POSIX_SEMAPHORES @@ -435,6 +438,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR @@ -444,6 +453,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + /* Define to 1 if you have the header file. */ #undef HAVE_STROPTS_H