about summary refs log tree commit diff
path: root/NEWS
diff options
context:
space:
mode:
authorMeador Inge <meadori@codesourcery.com>2014-06-13 14:02:04 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-06-13 14:02:04 +0530
commit995a46bbfba9964e328e3947130919d8bd3cd62a (patch)
treec36f1da1cc528a8cfc1d891310be2599c0507532 /NEWS
parentfebf6cc58c36cd5a978b8b5faedb5a932eb44c98 (diff)
downloadglibc-995a46bbfba9964e328e3947130919d8bd3cd62a.tar.gz
glibc-995a46bbfba9964e328e3947130919d8bd3cd62a.tar.xz
glibc-995a46bbfba9964e328e3947130919d8bd3cd62a.zip
get_nprocs: Only return explictly set cache values (BZ #16996)
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.
Diffstat (limited to 'NEWS')
-rw-r--r--NEWS2
1 files changed, 1 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 655226d5d5..38cc5b54de 100644
--- 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.