]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
get_nprocs: Only return explictly set cache values (BZ #16996)
authorMeador Inge <meadori@codesourcery.com>
Fri, 13 Jun 2014 08:32:04 +0000 (14:02 +0530)
committerSiddhesh Poyarekar <siddhesh@redhat.com>
Fri, 13 Jun 2014 08:32:04 +0000 (14:02 +0530)
The implementation of __get_nprocs uses a stactic variable to cache
the value of the current number of processors.  The caching breaks when
'time (NULL) == 0':

  $ cat nproc.c
  #include <stdio.h>
  #include <time.h>
  #include <sys/time.h>

  int main(int argc, char *argv[])
  {
    time_t t;
    struct timeval tv = {0, 0};
    printf("settimeofday({0, 0}, NULL) = %d\n", settimeofday(&tv, NULL));
    t = time(NULL);
    printf("Time: %d, CPUs: %d\n", (unsigned int)t, get_nprocs());
    return 0;
  }
  $ gcc -O3 nproc.c
  $ ./a.out
  settimeofday({0, 0}, NULL) = -1
  Time: 1401311578, CPUs: 4
  $ sudo ./a.out
  settimeofday({0, 0}, NULL) = 0
  Time: 0, CPUs: 0

The problem is with the condition used to check whether a cached
value should be returned or not:

  static int cached_result;
  static time_t timestamp;

  time_t now = time (NULL);
  time_t prev = timestamp;
  atomic_read_barrier ();
  if (now == prev)
    return cached_result;

This patch fixes the problem by ensuring that 'cached_result' has
been set at least once before returning it.

ChangeLog
NEWS
sysdeps/unix/sysv/linux/getsysstats.c

index 83764a5840fc6a25c0dabed2beab130b0a73ff2d..d5474af375767a7f93671a93d459fae02971a00d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-06-13  Meador Inge  <meadori@codesourcery.com>
+
+       [BZ #16996]
+       sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs): Ensure
+       that the cached result has been set before returning it.
+
 2014-06-12  Roland McGrath  <roland@hack.frob.com>
 
        * nptl/sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Moved ...
diff --git a/NEWS b/NEWS
index 655226d5d5d0726d037cb824733074f74a124bd8..38cc5b54dee17b8656e687137195be38e87ebdb1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,7 +19,7 @@ Version 2.20
   16791, 16796, 16799, 16800, 16815, 16823, 16824, 16831, 16838, 16849,
   16854, 16876, 16877, 16878, 16882, 16885, 16888, 16890, 16912, 16915,
   16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16965, 16966,
-  16967, 16977, 16978, 16984, 16990, 17009, 17042, 17048.
+  16967, 16977, 16978, 16984, 16990, 16996, 17009, 17042, 17048.
 
 * The minimum Linux kernel version that this version of the GNU C Library
   can be used with is 2.6.32.
index b6a6fe3e2fa7b1c4c781a6adef87e56baeeff369..755c25986258c17462d04c4e1b39abc2999c6260 100644 (file)
@@ -126,13 +126,13 @@ next_line (int fd, char *const buffer, char **cp, char **re,
 int
 __get_nprocs (void)
 {
-  static int cached_result;
+  static int cached_result = -1;
   static time_t timestamp;
 
   time_t now = time (NULL);
   time_t prev = timestamp;
   atomic_read_barrier ();
-  if (now == prev)
+  if (now == prev && cached_result > -1)
     return cached_result;
 
   /* XXX Here will come a test for the new system call.  */