diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 120c848bfb5..aec8caaf20b 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1110,6 +1110,12 @@ posix_mkdir(PyObject *self, PyObject *args) #ifdef HAVE_NICE +#if defined(HAVE_BROKEN_NICE) && defined(HAVE_SYS_RESOURCE_H) +#if defined(HAVE_GETPRIORITY) && !defined(PRIO_PROCESS) +#include +#endif +#endif + static char posix_nice__doc__[] = "nice(inc) -> new_priority\n\ Decrease the priority of process and return new priority."; @@ -1124,8 +1130,8 @@ posix_nice(PyObject *self, PyObject *args) /* There are two flavours of 'nice': one that returns the new priority (as required by almost all standards out there) and the - Linux one, which returns '0' on success and advices the use of - getpriority() to get the new priority. + Linux/FreeBSD/BSDI one, which returns '0' on success and advices + the use of getpriority() to get the new priority. If we are of the nice family that returns the new priority, we need to clear errno before the call, and check if errno is filled @@ -1134,7 +1140,7 @@ posix_nice(PyObject *self, PyObject *args) errno = 0; value = nice(increment); -#ifdef HAVE_GETPRIORITY +#if defined(HAVE_BROKEN_NICE) && defined(HAVE_GETPRIORITY) if (value == 0) value = getpriority(PRIO_PROCESS, 0); #endif diff --git a/acconfig.h b/acconfig.h index bee71f80f7b..165a9bc5250 100644 --- a/acconfig.h +++ b/acconfig.h @@ -116,6 +116,9 @@ /* Define as the size of the unicode type. */ #undef Py_UNICODE_SIZE +/* Define if nice() returns success/failure instead of the new priority. */ +#undef HAVE_BROKEN_NICE + /* Define if malloc(0) returns a NULL pointer */ #undef MALLOC_ZERO_RETURNS_NULL diff --git a/config.h.in b/config.h.in index a3b7e9e31cd..2de2016e566 100644 --- a/config.h.in +++ b/config.h.in @@ -175,6 +175,9 @@ /* Define as the size of the unicode type. */ #undef Py_UNICODE_SIZE +/* Define if nice() returns success/failure instead of the new priority. */ +#undef HAVE_BROKEN_NICE + /* Define if malloc(0) returns a NULL pointer */ #undef MALLOC_ZERO_RETURNS_NULL @@ -641,6 +644,9 @@ /* Define if you have the header file. */ #undef HAVE_SYS_PARAM_H +/* Define if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + /* Define if you have the header file. */ #undef HAVE_SYS_SELECT_H diff --git a/configure b/configure index 77a64e2a34e..67d6a97bcec 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh -# From configure.in Revision: 1.225 +# From configure.in Revision: 1.226 # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 @@ -2074,7 +2074,7 @@ signal.h stdarg.h stddef.h stdlib.h thread.h unistd.h utime.h termios.h \ sys/audioio.h sys/file.h sys/lock.h sys/modem.h db_185.h db.h \ sys/param.h sys/select.h sys/socket.h sys/time.h sys/times.h \ sys/un.h sys/utsname.h sys/wait.h pty.h libutil.h \ -ndbm.h db1/ndbm.h gdbm/ndbm.h +ndbm.h db1/ndbm.h gdbm/ndbm.h sys/resource.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 @@ -6876,6 +6876,51 @@ else fi +echo $ac_n "checking for broken nice()""... $ac_c" 1>&6 +echo "configure:6881: checking for broken nice()" >&5 +if eval "test \"`echo '$''{'ac_cv_broken_nice'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + +if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_broken_nice=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_broken_nice=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_broken_nice" 1>&6 +if test "$ac_cv_broken_nice" = yes +then + cat >> confdefs.h <<\EOF +#define HAVE_BROKEN_NICE 1 +EOF + +fi + # THIS MUST BE LAST, IT CAN BREAK OTHER TESTS! # Add sys/socket.h to confdefs.h cat >> confdefs.h <<\EOF @@ -6884,12 +6929,12 @@ cat >> confdefs.h <<\EOF #endif EOF echo $ac_n "checking for socklen_t""... $ac_c" 1>&6 -echo "configure:6888: checking for socklen_t" >&5 +echo "configure:6933: checking for socklen_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_socklen_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -6938,7 +6983,7 @@ done SRCDIRS="Parser Grammar Objects Python Modules" echo $ac_n "checking for build directories""... $ac_c" 1>&6 -echo "configure:6942: checking for build directories" >&5 +echo "configure:6987: checking for build directories" >&5 for dir in $SRCDIRS; do if test ! -d $dir; then mkdir $dir diff --git a/configure.in b/configure.in index 6359a46c3e8..8977512e777 100644 --- a/configure.in +++ b/configure.in @@ -545,7 +545,7 @@ signal.h stdarg.h stddef.h stdlib.h thread.h unistd.h utime.h termios.h \ sys/audioio.h sys/file.h sys/lock.h sys/modem.h db_185.h db.h \ sys/param.h sys/select.h sys/socket.h sys/time.h sys/times.h \ sys/un.h sys/utsname.h sys/wait.h pty.h libutil.h \ -ndbm.h db1/ndbm.h gdbm/ndbm.h) +ndbm.h db1/ndbm.h gdbm/ndbm.h sys/resource.h) AC_HEADER_DIRENT # checks for typedefs @@ -1671,6 +1671,23 @@ fi AC_CHECK_LIB(readline, rl_completion_matches, AC_DEFINE(HAVE_RL_COMPLETION_MATCHES), , -ltermcap) +AC_MSG_CHECKING(for broken nice()) +AC_CACHE_VAL(ac_cv_broken_nice, [ +AC_TRY_RUN([ +int main() +{ + int val1 = nice(1); + if (val1 != -1 && val1 == nice(2)) + exit(0); + exit(1); +} +],ac_cv_broken_nice=yes, ac_cv_broken_nice=no)]) +AC_MSG_RESULT($ac_cv_broken_nice) +if test "$ac_cv_broken_nice" = yes +then + AC_DEFINE(HAVE_BROKEN_NICE) +fi + # THIS MUST BE LAST, IT CAN BREAK OTHER TESTS! # Add sys/socket.h to confdefs.h cat >> confdefs.h <<\EOF