mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +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>
|
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
|
* nscd/connections.c (start_threads): Use sysconf in case
|
||||||
_POSIX_CLOCK_SELECTION or _POSIX_MONOTONIC_CLOCK is not greater zero.
|
_POSIX_CLOCK_SELECTION or _POSIX_MONOTONIC_CLOCK is not greater zero.
|
||||||
|
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
2004-10-04 Ulrich Drepper <drepper@redhat.com>
|
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
|
* sysdeps/unix/sysv/linux/bits/posix_opt.h: Define
|
||||||
_POSIX_THREAD_PROCESS_SHARED and _POSIX_CLOCK_SELECTION as -1.
|
_POSIX_THREAD_PROCESS_SHARED and _POSIX_CLOCK_SELECTION as -1.
|
||||||
* sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
|
* sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
|
||||||
|
@ -106,10 +106,10 @@
|
|||||||
#define _POSIX_SHARED_MEMORY_OBJECTS 200112L
|
#define _POSIX_SHARED_MEMORY_OBJECTS 200112L
|
||||||
|
|
||||||
/* CPU-time clocks supported. */
|
/* CPU-time clocks supported. */
|
||||||
#define _POSIX_CPUTIME 200112L
|
#define _POSIX_CPUTIME 0
|
||||||
|
|
||||||
/* We support the clock also in threads. */
|
/* We support the clock also in threads. */
|
||||||
#define _POSIX_THREAD_CPUTIME 200112L
|
#define _POSIX_THREAD_CPUTIME 0
|
||||||
|
|
||||||
/* GNU libc provides regular expression handling. */
|
/* GNU libc provides regular expression handling. */
|
||||||
#define _POSIX_REGEXP 1
|
#define _POSIX_REGEXP 1
|
||||||
|
@ -106,10 +106,10 @@
|
|||||||
#define _POSIX_SHARED_MEMORY_OBJECTS 200112L
|
#define _POSIX_SHARED_MEMORY_OBJECTS 200112L
|
||||||
|
|
||||||
/* CPU-time clocks supported. */
|
/* CPU-time clocks supported. */
|
||||||
#define _POSIX_CPUTIME 200112L
|
#define _POSIX_CPUTIME 0
|
||||||
|
|
||||||
/* We support the clock also in threads. */
|
/* We support the clock also in threads. */
|
||||||
#define _POSIX_THREAD_CPUTIME 200112L
|
#define _POSIX_THREAD_CPUTIME 0
|
||||||
|
|
||||||
/* GNU libc provides regular expression handling. */
|
/* GNU libc provides regular expression handling. */
|
||||||
#define _POSIX_REGEXP 1
|
#define _POSIX_REGEXP 1
|
||||||
|
@ -1459,16 +1459,15 @@ start_threads (void)
|
|||||||
&& defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0
|
&& defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0
|
||||||
/* Determine whether the monotonous clock is available. */
|
/* Determine whether the monotonous clock is available. */
|
||||||
struct timespec dummy;
|
struct timespec dummy;
|
||||||
if (
|
|
||||||
# if _POSIX_MONOTONIC_CLOCK == 0
|
# if _POSIX_MONOTONIC_CLOCK == 0
|
||||||
sysconf (_SC_MONOTONIC_CLOCK) > 0 &&
|
if (sysconf (_SC_MONOTONIC_CLOCK) > 0)
|
||||||
# endif
|
# endif
|
||||||
# if _POSIX_CLOCK_SELECTION == 0
|
# if _POSIX_CLOCK_SELECTION == 0
|
||||||
sysconf (_SC_CLOCK_SELECTION) > 0 &&
|
if (sysconf (_SC_CLOCK_SELECTION) > 0)
|
||||||
# endif
|
# endif
|
||||||
clock_getres (CLOCK_MONOTONIC, &dummy) == 0
|
if (clock_getres (CLOCK_MONOTONIC, &dummy) == 0
|
||||||
&& pthread_condattr_setclock (&condattr, CLOCK_MONOTONIC) == 0)
|
&& pthread_condattr_setclock (&condattr, CLOCK_MONOTONIC) == 0)
|
||||||
timeout_clock = CLOCK_MONOTONIC;
|
timeout_clock = CLOCK_MONOTONIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pthread_cond_init (&readylist_cond, &condattr);
|
pthread_cond_init (&readylist_cond, &condattr);
|
||||||
|
@ -319,16 +319,9 @@ handle_amd (int name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Get the value of the system variable NAME. */
|
static int
|
||||||
long int
|
i386_i486_test (void)
|
||||||
__sysconf (int name)
|
|
||||||
{
|
{
|
||||||
/* 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 eflags;
|
||||||
int ac;
|
int ac;
|
||||||
asm volatile ("pushfl;\n\t"
|
asm volatile ("pushfl;\n\t"
|
||||||
@ -343,6 +336,35 @@ __sysconf (int name)
|
|||||||
"pushl %0;\n\t"
|
"pushl %0;\n\t"
|
||||||
"popfl"
|
"popfl"
|
||||||
: "=r" (eflags), "=r" (ac));
|
: "=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)
|
if (ac == 0)
|
||||||
/* This is an i386. */
|
/* This is an i386. */
|
||||||
// XXX Is this true for all brands?
|
// XXX Is this true for all brands?
|
||||||
|
@ -2,6 +2,7 @@ clone.S
|
|||||||
clone2.S
|
clone2.S
|
||||||
dl-brk.S
|
dl-brk.S
|
||||||
dl-static.c
|
dl-static.c
|
||||||
|
has_cpuclock.c
|
||||||
ioperm.c
|
ioperm.c
|
||||||
ldd-rewrite.sed
|
ldd-rewrite.sed
|
||||||
__start_context.S
|
__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.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -24,6 +24,9 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "has_cpuclock.c"
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
clock_getcpuclockid (pid_t pid, clockid_t *clock_id)
|
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 ())
|
if (pid != 0 && pid != getpid ())
|
||||||
return EPERM;
|
return EPERM;
|
||||||
|
|
||||||
static int itc_usable;
|
if (has_cpuclock () > 0)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
/* Store the number. */
|
/* Store the number. */
|
||||||
*clock_id = CLOCK_PROCESS_CPUTIME_ID;
|
*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