Skip to content

Commit

Permalink
Re-do the broken-nice() patch to break less platforms. Hopefully none :P
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Yhg1s committed Jul 11, 2001
1 parent 3230d5c commit e38b2f1
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 9 deletions.
12 changes: 9 additions & 3 deletions Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 <sys/resource.h>
#endif
#endif

static char posix_nice__doc__[] =
"nice(inc) -> new_priority\n\
Decrease the priority of process and return new priority.";
Expand All @@ -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
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions acconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
6 changes: 6 additions & 0 deletions config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -641,6 +644,9 @@
/* Define if you have the <sys/param.h> header file. */
#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. */
#undef HAVE_SYS_SELECT_H

Expand Down
55 changes: 50 additions & 5 deletions configure
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 <<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!
# Add sys/socket.h to confdefs.h
cat >> confdefs.h <<\EOF
Expand All @@ -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 <<EOF
#line 6893 "configure"
#line 6938 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
Expand Down Expand Up @@ -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
Expand Down
19 changes: 18 additions & 1 deletion configure.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit e38b2f1

Please sign in to comment.