mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
Update.
* 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.
This commit is contained in:
parent
3078cba2f7
commit
94d824f920
@ -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.
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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?
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
52
sysdeps/unix/sysv/linux/ia64/has_cpuclock.c
Normal file
52
sysdeps/unix/sysv/linux/ia64/has_cpuclock.c
Normal file
@ -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;
|
||||
}
|
45
sysdeps/unix/sysv/linux/ia64/sysconf.c
Normal file
45
sysdeps/unix/sysv/linux/ia64/sysconf.c
Normal file
@ -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"
|
Loading…
Reference in New Issue
Block a user