Re-do the broken-nice() patch to break less platforms. Hopefully none :P

Also note that it isn't just Linux nice() that is broken: at least FreeBSD
and BSDI also have this problem. os.nice() should probably just be emulated
using getpriority()/setpriority(), if they are available, but I'll get to
that later.
This commit is contained in:
Thomas Wouters 2001-07-11 22:35:31 +00:00
parent 3230d5c961
commit e38b2f1f00
5 changed files with 86 additions and 9 deletions

View File

@ -1110,6 +1110,12 @@ posix_mkdir(PyObject *self, PyObject *args)
#ifdef HAVE_NICE #ifdef HAVE_NICE
#if defined(HAVE_BROKEN_NICE) && defined(HAVE_SYS_RESOURCE_H)
#if defined(HAVE_GETPRIORITY) && !defined(PRIO_PROCESS)
#include <sys/resource.h>
#endif
#endif
static char posix_nice__doc__[] = static char posix_nice__doc__[] =
"nice(inc) -> new_priority\n\ "nice(inc) -> new_priority\n\
Decrease the priority of process and return new priority."; 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 /* There are two flavours of 'nice': one that returns the new
priority (as required by almost all standards out there) and the priority (as required by almost all standards out there) and the
Linux one, which returns '0' on success and advices the use of Linux/FreeBSD/BSDI one, which returns '0' on success and advices
getpriority() to get the new priority. the use of getpriority() to get the new priority.
If we are of the nice family that returns the new priority, we 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 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; errno = 0;
value = nice(increment); value = nice(increment);
#ifdef HAVE_GETPRIORITY #if defined(HAVE_BROKEN_NICE) && defined(HAVE_GETPRIORITY)
if (value == 0) if (value == 0)
value = getpriority(PRIO_PROCESS, 0); value = getpriority(PRIO_PROCESS, 0);
#endif #endif

View File

@ -116,6 +116,9 @@
/* Define as the size of the unicode type. */ /* Define as the size of the unicode type. */
#undef Py_UNICODE_SIZE #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 */ /* Define if malloc(0) returns a NULL pointer */
#undef MALLOC_ZERO_RETURNS_NULL #undef MALLOC_ZERO_RETURNS_NULL

View File

@ -175,6 +175,9 @@
/* Define as the size of the unicode type. */ /* Define as the size of the unicode type. */
#undef Py_UNICODE_SIZE #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 */ /* Define if malloc(0) returns a NULL pointer */
#undef MALLOC_ZERO_RETURNS_NULL #undef MALLOC_ZERO_RETURNS_NULL
@ -641,6 +644,9 @@
/* Define if you have the <sys/param.h> header file. */ /* Define if you have the <sys/param.h> header file. */
#undef HAVE_SYS_PARAM_H #undef HAVE_SYS_PARAM_H
/* Define if you have the <sys/resource.h> header file. */
#undef HAVE_SYS_RESOURCE_H
/* Define if you have the <sys/select.h> header file. */ /* Define if you have the <sys/select.h> header file. */
#undef HAVE_SYS_SELECT_H #undef HAVE_SYS_SELECT_H

55
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# From configure.in Revision: 1.225 # From configure.in Revision: 1.226
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 # 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/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/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 \ 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 do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
@ -6876,6 +6876,51 @@ else
fi 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 <<EOF
#line 6890 "configure"
#include "confdefs.h"
int main()
{
int val1 = nice(1);
if (val1 != -1 && val1 == nice(2))
exit(0);
exit(1);
}
EOF
if { (eval echo configure:6902: \"$ac_link\") 1>&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! # THIS MUST BE LAST, IT CAN BREAK OTHER TESTS!
# Add sys/socket.h to confdefs.h # Add sys/socket.h to confdefs.h
cat >> confdefs.h <<\EOF cat >> confdefs.h <<\EOF
@ -6884,12 +6929,12 @@ cat >> confdefs.h <<\EOF
#endif #endif
EOF EOF
echo $ac_n "checking for socklen_t""... $ac_c" 1>&6 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 if eval "test \"`echo '$''{'ac_cv_type_socklen_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 6893 "configure" #line 6938 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <sys/types.h> #include <sys/types.h>
#if STDC_HEADERS #if STDC_HEADERS
@ -6938,7 +6983,7 @@ done
SRCDIRS="Parser Grammar Objects Python Modules" SRCDIRS="Parser Grammar Objects Python Modules"
echo $ac_n "checking for build directories""... $ac_c" 1>&6 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 for dir in $SRCDIRS; do
if test ! -d $dir; then if test ! -d $dir; then
mkdir $dir mkdir $dir

View File

@ -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/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/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 \ 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 AC_HEADER_DIRENT
# checks for typedefs # checks for typedefs
@ -1671,6 +1671,23 @@ fi
AC_CHECK_LIB(readline, rl_completion_matches, AC_CHECK_LIB(readline, rl_completion_matches,
AC_DEFINE(HAVE_RL_COMPLETION_MATCHES), , -ltermcap) 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! # THIS MUST BE LAST, IT CAN BREAK OTHER TESTS!
# Add sys/socket.h to confdefs.h # Add sys/socket.h to confdefs.h
cat >> confdefs.h <<\EOF cat >> confdefs.h <<\EOF