2000-04-10  Ulrich Drepper  <drepper@redhat.com>

	* Versions.def (librt): Add GLIBC_2.2.
	* rt/Makefile (librt-routines): Add get_clockfreq, clock_getcpuclockid,
	clock_getres, clock_gettime, clock_settime, timer_create, timer_delete,
	timer_getoverr, timer_gettime, and timer_settime.
	* rt/Versions [librt] (GLIBC_2.2): Add clock_getres, clock_gettime,
	clock_settime, timer_create, timer_delete, timer_getoverrun,
	timer_gettime, and timer_settime.
	* sysdeps/generic/clock_getcpuclockid.c: New file.
	* sysdeps/generic/get_clockfreq.c: New file.
	* sysdeps/unix/i386/clock_getcpuclockid.c: New file.
	* sysdeps/unix/sysv/linux/i386/get_clockfreq.c: New file.
	* sysdeps/mach/hurd/i386/bits/time.h: New file.
	* sysdeps/unix/i386/i586/clock_getres.c: New file.
	* sysdeps/unix/i386/i586/clock_gettime.c: New file.
	* sysdeps/unix/i386/i686/Implies: New file.
	* sysdpes/unix/sysv/linux/i386/bits/time.h: New file.
	* time/Makefile (routines): Move clock_getres, clock_gettime,
	clock_settime, timer_create, timer_delete, timer_getoverr,
	timer_gettime, and timer_settime to rt/Makefile.
	* time/Versions [libc] (GLIBC_2.2): Remove clock_getres, clock_gettime,
	clock_settime, timer_create, timer_delete, timer_getoverrun,
	timer_gettime, and timer_settime.

	* sysdeps/mach/hurd/bits/time.h: Drop K&R compatibility.  Use __const__
	and not const as attribute name.
This commit is contained in:
Ulrich Drepper 2000-04-11 07:08:31 +00:00
parent 25ee87d6f1
commit 6689a1882b
16 changed files with 502 additions and 16 deletions

View file

@ -1,3 +1,31 @@
2000-04-10 Ulrich Drepper <drepper@redhat.com>
* Versions.def (librt): Add GLIBC_2.2.
* rt/Makefile (librt-routines): Add get_clockfreq, clock_getcpuclockid,
clock_getres, clock_gettime, clock_settime, timer_create, timer_delete,
timer_getoverr, timer_gettime, and timer_settime.
* rt/Versions [librt] (GLIBC_2.2): Add clock_getres, clock_gettime,
clock_settime, timer_create, timer_delete, timer_getoverrun,
timer_gettime, and timer_settime.
* sysdeps/generic/clock_getcpuclockid.c: New file.
* sysdeps/generic/get_clockfreq.c: New file.
* sysdeps/unix/i386/clock_getcpuclockid.c: New file.
* sysdeps/unix/sysv/linux/i386/get_clockfreq.c: New file.
* sysdeps/mach/hurd/i386/bits/time.h: New file.
* sysdeps/unix/i386/i586/clock_getres.c: New file.
* sysdeps/unix/i386/i586/clock_gettime.c: New file.
* sysdeps/unix/i386/i686/Implies: New file.
* sysdpes/unix/sysv/linux/i386/bits/time.h: New file.
* time/Makefile (routines): Move clock_getres, clock_gettime,
clock_settime, timer_create, timer_delete, timer_getoverr,
timer_gettime, and timer_settime to rt/Makefile.
* time/Versions [libc] (GLIBC_2.2): Remove clock_getres, clock_gettime,
clock_settime, timer_create, timer_delete, timer_getoverrun,
timer_gettime, and timer_settime.
* sysdeps/mach/hurd/bits/time.h: Drop K&R compatibility. Use __const__
and not const as attribute name.
2000-04-10 Thorsten Kukuk <kukuk@suse.de>
* elf/cache.c (save_cache): Make sure /etc/ld.so.cache is mode 644.

View file

@ -72,6 +72,7 @@ libresolv {
}
librt {
GLIBC_2.1
GLIBC_2.2
}
libutil {
GLIBC_2.0

View file

@ -1,4 +1,4 @@
# Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
# Copyright (C) 1997, 1998, 1999, 2000 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
@ -26,7 +26,10 @@ headers := aio.h
librt-routines := aio_cancel aio_error aio_fsync aio_misc aio_read \
aio_read64 aio_return aio_suspend aio_write \
aio_write64 lio_listio lio_listio64 aio_sigqueue \
aio_notify
aio_notify get_clockfreq clock_getcpuclockid \
clock_getres clock_gettime clock_settime \
timer_create timer_delete timer_getoverr \
timer_gettime timer_settime
# Make sure that everything is distributed independent of configuration.
distribute := aio_misc.h $(librt-routines:=.c) $(librt-map)

View file

@ -5,4 +5,12 @@ librt {
aio_init; aio_read; aio_read64; aio_return; aio_return64; aio_suspend;
aio_suspend64; aio_write; aio_write64; lio_listio; lio_listio64;
}
GLIBC_2.2 {
# c*
clock_getres; clock_gettime; clock_settime; clock_getcpuclockid;
# t*
timer_create; timer_delete; timer_getoverrun; timer_gettime;
timer_settime;
}
}

View file

@ -0,0 +1,27 @@
/* Copyright (C) 2000 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <sys/time.h>
int
clock_getcpuclockid (pid_t pid, clockid_t *clock_id)
{
/* We don't have a timer for that. */
return ENOENT;
}

View file

@ -0,0 +1,26 @@
/* Get frequency of the system processor.
Copyright (C) 2000 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
unsigned long long int
__get_clockfreq (void)
{
/* There is no generic way to find this out since we have in general
no counter register either. */
return 0ull;
}

View file

@ -1,5 +1,5 @@
/* System-dependent timing definitions. Hurd version.
Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1999, 2000 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
@ -38,7 +38,7 @@
presents the real value for clock ticks per second for the system.
This value is determined at runtime. */
# define CLK_TCK __libc_clk_tck()
extern int __libc_clk_tck __P ((void)) __attribute__ ((const));
extern int __libc_clk_tck (void) __attribute__ ((__const__));
# endif
/* Clock ID used in clock and timer functions. */

View file

@ -0,0 +1,78 @@
/* System-dependent timing definitions. i386/Hurd version.
Copyright (C) 1996, 1997, 1999, 2000 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/*
* Never include this file directly; use <time.h> instead.
*/
#ifndef __need_timeval
# ifndef _BITS_TIME_H
# define _BITS_TIME_H 1
/* ISO/IEC 9899:1990 7.12.1: <time.h>
The macro `CLOCKS_PER_SEC' is the number per second of the value
returned by the `clock' function. */
/* CAE XSH, Issue 4, Version 2: <time.h>
The value of CLOCKS_PER_SEC is required to be 1 million on all
XSI-conformant systems. */
# define CLOCKS_PER_SEC 1000000
# ifndef __STRICT_ANSI__
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
presents the real value for clock ticks per second for the system.
This value is determined at runtime. */
# define CLK_TCK __libc_clk_tck()
extern int __libc_clk_tck (void) __attribute__ ((__const__));
# endif
/* Clock ID used in clock and timer functions. */
typedef int __clockid_t;
/* Timer ID returned by `timer_create'. */
typedef int __timer_t;
# ifdef __USE_POSIX199309
/* Identifier for system-wide realtime clock. */
# define CLOCK_REALTIME 0
/* High-resolution timer from the CPU. */
# define __CLOCK_HIGHRES 1
/* Flag to indicate time is absolute. */
# define TIMER_ABSTIME 1
# endif
# endif /* bits/time.h */
#endif
#ifdef __need_timeval
# undef __need_timeval
# ifndef _STRUCT_TIMEVAL
# define _STRUCT_TIMEVAL 1
# include <bits/types.h>
/* A time value that is accurate to the nearest
microsecond but also has a range of years. */
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
# endif /* struct timeval */
#endif /* need timeval */

View file

@ -0,0 +1,34 @@
/* Copyright (C) 2000 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
int
clock_getcpuclockid (pid_t pid, clockid_t *clock_id)
{
/* We don't allow any process ID but our own. */
if (pid != 0 && pid != getpid ())
return EPERM;
/* Store the number. */
*clock_id = __CLOCK_HIGHRES;
return 0;
}

View file

@ -0,0 +1,71 @@
/* Copyright (C) 1999, 2000 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sys/param.h>
#include <sys/time.h>
/* This implementation uses the TSC register in modern (i586 and up) IA-32
processors (most modern clones also provide it). Since we need the
resolution of the clock and since determining this is not cheap, we
cache the value. But this means that systems with processors running
at different speeds or process migration to machines with slower or
faster processors will not work without changes. */
/* Function to determine processor frequency. */
extern unsigned long long int __get_clockfreq (void);
/* Clock frequency of the processor. We make it a 64-bit variable
because some jokers are already playing with processors with more
than 4GHz. */
static long int nsec;
/* We add an limitation here: we assume that the machine is not up as
long as it takes to wrap-around the 64-bit timestamp counter. On a
4GHz machine it would take 136 years of uptime to wrap around so
this "limitation" is not severe. */
#define EXTRA_CLOCK_CASES \
case __CLOCK_HIGHRES: \
{ \
if (__builtin_expect (nsec != 0, 0)) \
{ \
unsigned long long int freq; \
\
/* This can only happen if we haven't initialized the `freq' \
variable yet. Do this now. We don't have to protect this \
code against multiple execution since all of them should \
lead to the same result. */ \
freq = __get_clockfreq (); \
if (__builtin_expect (freq == 0, 0)) \
/* Something went wrong. */ \
break; \
\
nsec = MAX (1000000000ULL / freq, 1); \
} \
\
/* File in the values. The seconds are always zero (unless we \
have a 1Hz machine). */ \
res->tv_sec = 0; \
res->tv_nsec = nsec; \
\
retval = 0; \
} \
break;
#include <sysdeps/posix/clock_getres.c>

View file

@ -0,0 +1,71 @@
/* Copyright (C) 1999, 2000 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sys/time.h>
/* This implementation uses the TSC register in modern (i586 and up) IA-32
processors (most modern clones also provide it). Since we need the
resolution of the clock and since determining this is not cheap, we
cache the value. But this means that systems with processors running
at different speeds or process migration to machines with slower or
faster processors will not work without changes. */
/* Function to determine processor frequency. */
extern unsigned long long int __get_glockfreq (void);
/* Clock frequency of the processor. We make it a 64-bit variable
because some jokers are already playing with processors with more
than 4GHz. */
static unsigned long long int freq;
/* We add an limitation here: we assume that the machine is not up as
long as it takes to wrap-around the 64-bit timestamp counter. On a
4GHz machine it would take 136 years of uptime to wrap around so
this "limitation" is not severe. */
#define EXTRA_CLOCK_CASES \
case __CLOCK_HIGHRES: \
{ \
unsigned long long int tsc; \
\
if (__builtin_expect (freq != 0, 0)) \
{ \
/* This can only happen if we haven't initialized the `freq' \
variable yet. Do this now. We don't have to protect this \
code against multiple execution since all of them should \
lead to the same result. */ \
freq = __get_clockfreq (); \
if (__builtin_expect (freq == 0, 0)) \
/* Something went wrong. */ \
break; \
} \
\
/* Get the current counter. */ \
asm volatile ("rdtsc" : "=A" (tsc)); \
\
/* Compute the seconds. */ \
tp->tv_sec = tsc / freq; \
\
/* And the nanoseconds. This computation should be stable until \
we get machines with about 16GHz frequency. */ \
tp->tv_nsec = ((tsc % freq) * 1000000000ULL) / freq; \
} \
break;
#include <sysdeps/unix/clock_gettime.c>

View file

@ -0,0 +1 @@
unix/i386/i586

View file

@ -0,0 +1,75 @@
/* System-dependent timing definitions. Linux version.
Copyright (C) 1996, 1997, 1999, 2000 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/*
* Never include this file directly; use <time.h> instead.
*/
#ifndef __need_timeval
# ifndef _BITS_TIME_H
# define _BITS_TIME_H 1
/* ISO/IEC 9899:1990 7.12.1: <time.h>
The macro `CLOCKS_PER_SEC' is the number per second of the value
returned by the `clock' function. */
/* CAE XSH, Issue 4, Version 2: <time.h>
The value of CLOCKS_PER_SEC is required to be 1 million on all
XSI-conformant systems. */
# define CLOCKS_PER_SEC 1000000
# ifndef __STRICT_ANSI__
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
presents the real value for clock ticks per second for the system. */
# define CLK_TCK 100
# endif
/* Clock ID used in clock and timer functions. */
typedef int __clockid_t;
/* Timer ID returned by `timer_create'. */
typedef int __timer_t;
# ifdef __USE_POSIX199309
/* Identifier for system-wide realtime clock. */
# define CLOCK_REALTIME 0
/* High-resolution timer from the CPU. */
# define __CLOCK_HIGHRES 1
/* Flag to indicate time is absolute. */
# define TIMER_ABSTIME 1
# endif
# endif /* bits/time.h */
#endif
#ifdef __need_timeval
# undef __need_timeval
# ifndef _STRUCT_TIMEVAL
# define _STRUCT_TIMEVAL 1
# include <bits/types.h>
/* A time value that is accurate to the nearest
microsecond but also has a range of years. */
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
# endif /* struct timeval */
#endif /* need timeval */

View file

@ -0,0 +1,73 @@
/* Get frequency of the system processor. i386/Linux version.
Copyright (C) 2000 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
unsigned long long int
__get_clockfreq (void)
{
/* We read the information from the /proc filesystem. It contains at
least one line like
cpu MHz : 497.840237
We search for this line and convert the number in an integer. */
unsigned long long int result = 0ull;
int fd;
fd = open ("/proc/cpuinfo", O_RDONLY);
if (__builtin_expect (fd != -1, 1))
{
/* XXX AFAIK the /proc filesystem can generate "files" only up
to a size of 4096 bytes. */
char buf[4096];
ssize_t n;
n = read (fd, buf, sizeof buf);
if (__builtin_expect (n, 1) > 0)
{
char *mhz = memmem (buf, n, "cpu MHz", 7);
if (__builtin_expect (mhz != NULL, 1))
{
char *endp = buf + n;
/* Search for the beginning of the string. */
while (mhz < endp && (*mhz < '0' || *mhz > '9') && *mhz != '\n')
++mhz;
while (mhz < endp && *mhz != '\n')
{
if (*mhz >= '0' && *mhz <= '9')
{
result *= 10;
result += *mhz - '0';
}
++mhz;
}
}
}
close (fd);
}
return result;
}

View file

@ -1,4 +1,4 @@
# Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
# Copyright (C) 1991-1999, 2000 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
@ -28,10 +28,7 @@ routines := offtime asctime clock ctime ctime_r difftime \
gettimeofday settimeofday adjtime tzset \
tzfile getitimer setitimer \
stime dysize timegm ftime \
strptime getdate wcsftime \
clock_getres clock_gettime clock_settime \
timer_create timer_delete timer_getoverr \
timer_gettime timer_settime
strptime getdate wcsftime
tests := test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
tst-getdate

View file

@ -47,13 +47,6 @@ libc {
getdate; getdate_r; getitimer;
}
GLIBC_2.2 {
# c*
clock_getres; clock_gettime; clock_settime;
# t*
timer_create; timer_delete; timer_getoverrun; timer_gettime;
timer_settime;
# w*
wcsftime;
}