# HG changeset patch # User Bruno Haible # Date 1263172564 -3600 # Node ID f66d17eada1367934be6bfac279f3b109883eedb # Parent d8a6a11f856a8fc306fc490528dcc4f7c4e087d3 nproc: Work better on Linux when /proc and /sys are not mounted. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2010-01-10 Bruno Haible + nproc: Work better on Linux when /proc and /sys are not mounted. + * lib/nproc.c (num_processors): Use num_processors_via_affinity_mask () + as lower bound when, on glibc/Linux systems, + sysconf (_SC_NPROCESSORS_CONF) returns 1. + Suggested by Pádraig Brady . + Reported by Dmitry V. Levin . + nproc: Refactor. * lib/nproc.c (num_processors_via_affinity_mask): New function, extracted from num_processors. diff --git a/lib/nproc.c b/lib/nproc.c --- a/lib/nproc.c +++ b/lib/nproc.c @@ -239,7 +239,12 @@ The first number is the number of CPUs configured in the system. The second number is the number of CPUs available to the scheduler. The third number is the number of CPUs available to the current process. - */ + + Note! On Linux systems with glibc, the first and second number come from + the /sys and /proc file systems (see + glibc/sysdeps/unix/sysv/linux/getsysstats.c). + In some situations these file systems are not mounted, and the sysconf + call returns 1, which does not reflect the reality. */ if (query == NPROC_CURRENT) { @@ -266,6 +271,22 @@ { /* This works on glibc, MacOS X 10.5, FreeBSD, AIX, OSF/1, Solaris, Cygwin, Haiku. */ long int nprocs = sysconf (_SC_NPROCESSORS_CONF); + +# if __GLIBC__ >= 2 && defined __linux__ + /* On Linux systems with glibc, this information comes from the /sys and + /proc file systems (see glibc/sysdeps/unix/sysv/linux/getsysstats.c). + In some situations these file systems are not mounted, and the + sysconf call returns 1. But we wish to guarantee that + num_processors (NPROC_ALL) >= num_processors (NPROC_CURRENT). */ + if (nprocs == 1) + { + unsigned long nprocs_current = num_processors_via_affinity_mask (); + + if (nprocs_current > 0) + nprocs = nprocs_current; + } +# endif + if (nprocs > 0) return nprocs; }