diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | linuxthreads/ChangeLog | 4 | ||||
-rw-r--r-- | linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h | 4 | ||||
-rw-r--r-- | linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h | 4 | ||||
-rw-r--r-- | nscd/connections.c | 11 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/sysconf.c | 40 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/Dist | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c | 30 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/has_cpuclock.c | 52 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/sysconf.c | 45 |
10 files changed, 155 insertions, 44 deletions
@@ -1,5 +1,13 @@ 2004-10-04 Ulrich Drepper <drepper@redhat.com> + * sysdeps/unix/sysv/linux/ia64/sysconf.c: New file. + * sysdeps/unix/sysv/linux/ia64/Dist: Add has_cpuclock.c. + * sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c: Move actual + testing code to... + * sysdeps/unix/sysv/linux/ia64/has_cpuclock.c: ...here. New file. + * sysdeps/unix/sysv/linux/i386/sysconf.c: Add dynamic check for + _SC_CPUTIME and _SC_THREAD_CPUTIME. + * nscd/connections.c (start_threads): Use sysconf in case _POSIX_CLOCK_SELECTION or _POSIX_MONOTONIC_CLOCK is not greater zero. diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 35debfa020..a7bb38a5fe 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,5 +1,9 @@ 2004-10-04 Ulrich Drepper <drepper@redhat.com> + * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Set _POSIX_CPUTIME + and _POSIX_THREAD_CPUTIME to zero. + * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: Likewise. + * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define _POSIX_THREAD_PROCESS_SHARED and _POSIX_CLOCK_SELECTION as -1. * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise. diff --git a/linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h b/linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h index 7a4aa8011e..9c8e706d12 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h +++ b/linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h @@ -106,10 +106,10 @@ #define _POSIX_SHARED_MEMORY_OBJECTS 200112L /* CPU-time clocks supported. */ -#define _POSIX_CPUTIME 200112L +#define _POSIX_CPUTIME 0 /* We support the clock also in threads. */ -#define _POSIX_THREAD_CPUTIME 200112L +#define _POSIX_THREAD_CPUTIME 0 /* GNU libc provides regular expression handling. */ #define _POSIX_REGEXP 1 diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h b/linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h index 0d7d73c78f..0b18959f3a 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h +++ b/linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h @@ -106,10 +106,10 @@ #define _POSIX_SHARED_MEMORY_OBJECTS 200112L /* CPU-time clocks supported. */ -#define _POSIX_CPUTIME 200112L +#define _POSIX_CPUTIME 0 /* We support the clock also in threads. */ -#define _POSIX_THREAD_CPUTIME 200112L +#define _POSIX_THREAD_CPUTIME 0 /* GNU libc provides regular expression handling. */ #define _POSIX_REGEXP 1 diff --git a/nscd/connections.c b/nscd/connections.c index aae798ed47..594a5b8950 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -1459,16 +1459,15 @@ start_threads (void) && defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0 /* Determine whether the monotonous clock is available. */ struct timespec dummy; - if ( # if _POSIX_MONOTONIC_CLOCK == 0 - sysconf (_SC_MONOTONIC_CLOCK) > 0 && + if (sysconf (_SC_MONOTONIC_CLOCK) > 0) # endif # if _POSIX_CLOCK_SELECTION == 0 - sysconf (_SC_CLOCK_SELECTION) > 0 && + if (sysconf (_SC_CLOCK_SELECTION) > 0) # endif - clock_getres (CLOCK_MONOTONIC, &dummy) == 0 - && pthread_condattr_setclock (&condattr, CLOCK_MONOTONIC) == 0) - timeout_clock = CLOCK_MONOTONIC; + if (clock_getres (CLOCK_MONOTONIC, &dummy) == 0 + && pthread_condattr_setclock (&condattr, CLOCK_MONOTONIC) == 0) + timeout_clock = CLOCK_MONOTONIC; #endif pthread_cond_init (&readylist_cond, &condattr); diff --git a/sysdeps/unix/sysv/linux/i386/sysconf.c b/sysdeps/unix/sysv/linux/i386/sysconf.c index cb4706de73..8a9ab61912 100644 --- a/sysdeps/unix/sysv/linux/i386/sysconf.c +++ b/sysdeps/unix/sysv/linux/i386/sysconf.c @@ -319,16 +319,9 @@ handle_amd (int name) } -/* Get the value of the system variable NAME. */ -long int -__sysconf (int name) +static int +i386_i486_test (void) { - /* We only handle the cache information here (for now). */ - if (name < _SC_LEVEL1_ICACHE_SIZE || name > _SC_LEVEL4_CACHE_LINESIZE) - return linux_sysconf (name); - - /* Recognize i386 and compatible. These don't have any cache on - board. */ int eflags; int ac; asm volatile ("pushfl;\n\t" @@ -343,6 +336,35 @@ __sysconf (int name) "pushl %0;\n\t" "popfl" : "=r" (eflags), "=r" (ac)); + + return ac; +} + + +/* Get the value of the system variable NAME. */ +long int +__sysconf (int name) +{ + if (name == _SC_CPUTIME || name == _SC_THREAD_CPUTIME) + { + /* Check dynamically. */ + int ac = i386_i486_test (); + + /* Only i386 and i486 have no TSC. */ + // XXX We can add here test for machines which cannot support a + // XXX usabel TSC. + return ac == 0 || (ac & (1 << 21)) == 0 ? -1 : 200112L; + } + + /* All the remainder, except the cache information, is handled in + the generic code. */ + if (name < _SC_LEVEL1_ICACHE_SIZE || name > _SC_LEVEL4_CACHE_LINESIZE) + return linux_sysconf (name); + + /* Recognize i386 and compatible. These don't have any cache on + board. */ + int ac = i386_i486_test (); + if (ac == 0) /* This is an i386. */ // XXX Is this true for all brands? diff --git a/sysdeps/unix/sysv/linux/ia64/Dist b/sysdeps/unix/sysv/linux/ia64/Dist index c9e81a3e8f..b4118bdead 100644 --- a/sysdeps/unix/sysv/linux/ia64/Dist +++ b/sysdeps/unix/sysv/linux/ia64/Dist @@ -2,6 +2,7 @@ clone.S clone2.S dl-brk.S dl-static.c +has_cpuclock.c ioperm.c ldd-rewrite.sed __start_context.S diff --git a/sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c b/sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c index 68e5763a8c..229f93d67d 100644 --- a/sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c +++ b/sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -24,6 +24,9 @@ #include <fcntl.h> +#include "has_cpuclock.c" + + int clock_getcpuclockid (pid_t pid, clockid_t *clock_id) { @@ -31,30 +34,7 @@ clock_getcpuclockid (pid_t pid, clockid_t *clock_id) if (pid != 0 && pid != getpid ()) return EPERM; - static int itc_usable; - int retval = ENOENT; - - if (__builtin_expect (itc_usable == 0, 0)) - { - int newval = 1; - int fd = open ("/proc/sal/itc_drift", O_RDONLY); - if (__builtin_expect (fd != -1, 1)) - { - char buf[16]; - /* We expect the file to contain a single digit followed by - a newline. If the format changes we better not rely on - the file content. */ - if (read (fd, buf, sizeof buf) != 2 || buf[0] != '0' - || buf[1] != '\n') - newval = -1; - - close (fd); - } - - itc_usable = newval; - } - - if (itc_usable > 0) + if (has_cpuclock () > 0) { /* Store the number. */ *clock_id = CLOCK_PROCESS_CPUTIME_ID; diff --git a/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c b/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c new file mode 100644 index 0000000000..ee19161272 --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c @@ -0,0 +1,52 @@ +/* Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> + + +static int itc_usable; + +static int +has_cpuclock (void) +{ + if (__builtin_expect (itc_usable == 0, 0)) + { + int newval = 1; + int fd = open ("/proc/sal/itc_drift", O_RDONLY); + if (__builtin_expect (fd != -1, 1)) + { + char buf[16]; + /* We expect the file to contain a single digit followed by + a newline. If the format changes we better not rely on + the file content. */ + if (read (fd, buf, sizeof buf) != 2 || buf[0] != '0' + || buf[1] != '\n') + newval = -1; + + close (fd); + } + + itc_usable = newval; + } + + return itc_usable; +} diff --git a/sysdeps/unix/sysv/linux/ia64/sysconf.c b/sysdeps/unix/sysv/linux/ia64/sysconf.c new file mode 100644 index 0000000000..ea4bde2e43 --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/sysconf.c @@ -0,0 +1,45 @@ +/* Get file-specific information about a file. Linux version. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <assert.h> +#include <stdbool.h> +#include <stdlib.h> +#include <unistd.h> + + +#include "has_cpuclock.c" + +static long int linux_sysconf (int name); + + +/* Get the value of the system variable NAME. */ +long int +__sysconf (int name) +{ + if (name == _SC_CPUTIME || name == SC_THREAD_CPUTIME) + return has_cpuclock () ? 200112L : -1; + + /* Everything else is handled by the more general code. */ + return linux_sysconf (name); +} + +/* Now the generic Linux version. */ +#undef __sysconf +#define __sysconf static linux_sysconf +#include "../sysconf.c" |