2003-03-02  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/unix/sysv/linux/bits/posix_opt.h: Define
	_POSIX_MONOTONIC_CLOCK.
	* linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
This commit is contained in:
Ulrich Drepper 2003-03-03 04:57:09 +00:00
parent 1e543c0cc6
commit ad0e8eb0a5
11 changed files with 433 additions and 37 deletions

View File

@ -1,3 +1,9 @@
2003-03-02 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/bits/posix_opt.h: Define
_POSIX_MONOTONIC_CLOCK.
* linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
2003-03-01 Roland McGrath <roland@redhat.com>
* sysdeps/powerpc/powerpc64/pt-machine.h

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
/* Copyright (C) 1999, 2000, 2001, 2003 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,7 +24,7 @@
#include <libc-internal.h>
#if HP_TIMING_AVAIL
#if HP_TIMING_AVAIL && !defined HANDLED_CPUTIME
/* Clock frequency of the processor. */
static long int nsec;
#endif
@ -38,24 +38,33 @@ clock_getres (clockid_t clock_id, struct timespec *res)
switch (clock_id)
{
#define HANDLE_REALTIME \
do { \
long int clk_tck = sysconf (_SC_CLK_TCK); \
\
if (__builtin_expect (clk_tck != -1, 1)) \
{ \
/* This implementation assumes that the realtime clock has a \
resolution higher than 1 second. This is the case for any \
reasonable implementation. */ \
res->tv_sec = 0; \
res->tv_nsec = 1000000000 / clk_tck; \
\
retval = 0; \
} \
} while (0)
#ifdef SYSDEP_GETRES
SYSDEP_GETRES;
#endif
#ifndef HANDLED_REALTIME
case CLOCK_REALTIME:
{
long int clk_tck = sysconf (_SC_CLK_TCK);
if (__builtin_expect (clk_tck != -1, 1))
{
/* This implementation assumes that the realtime clock has a
resolution higher than 1 second. This is the case for any
reasonable implementation. */
res->tv_sec = 0;
res->tv_nsec = 1000000000 / clk_tck;
retval = 0;
}
}
HANDLE_REALTIME;
break;
#endif /* handled REALTIME */
#if HP_TIMING_AVAIL
#if HP_TIMING_AVAIL && !defined HANDLED_CPUTIME
case CLOCK_PROCESS_CPUTIME_ID:
case CLOCK_THREAD_CPUTIME_ID:
{

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
/* Copyright (C) 1999, 2000, 2001, 2002, 2003 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
@ -46,12 +46,23 @@ clock_gettime (clockid_t clock_id, struct timespec *tp)
switch (clock_id)
{
#define HANDLE_REALTIME \
do { \
retval = gettimeofday (&tv, NULL); \
if (retval == 0) \
/* Convert into `timespec'. */ \
TIMEVAL_TO_TIMESPEC (&tv, tp); \
} while (0)
#ifdef SYSDEP_GETTIME
SYSDEP_GETTIME;
#endif
#ifndef HANDLED_REALTIME
case CLOCK_REALTIME:
retval = gettimeofday (&tv, NULL);
if (retval == 0)
/* Convert into `timespec'. */
TIMEVAL_TO_TIMESPEC (&tv, tp);
HANDLE_REALTIME;
break;
#endif
#if HP_TIMING_AVAIL
case CLOCK_PROCESS_CPUTIME_ID:

View File

@ -1,5 +1,5 @@
/* High-resolution sleep with the specified clock.
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 2000, 2001, 2003 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,11 +24,16 @@
#if HP_TIMING_AVAIL
# define CLOCK_P(clock) \
(clock) != CLOCK_PROCESS_CPUTIME_ID \
&& (clock) != CLOCK_THREAD_CPUTIME_ID
# define CPUCLOCK_P(clock) \
((clock) != CLOCK_PROCESS_CPUTIME_ID \
&& (clock) != CLOCK_THREAD_CPUTIME_ID)
#else
# define CLOCK_P(clock) 0
# define CPUCLOCK_P(clock) 0
#endif
#ifndef INVALID_CLOCK_P
# define INVALID_CLOCK_P(cl) \
((cl) < CLOCK_REALTIME || (cl) > CLOCK_THREAD_CPUTIME_ID || CPUCLOCK_P (cl))
#endif
@ -44,6 +49,16 @@ clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
|| __builtin_expect (req->tv_nsec, 0) >= 1000000000)
return EINVAL;
if (CPUCLOCK_P (clock_id))
return ENOTSUP;
if (INVALID_CLOCK_P (clock_id))
return EINVAL;
#ifdef SYSDEP_NANOSLEEP
SYSDEP_NANOSLEEP;
#endif
/* If we got an absolute time, remap it. */
if (flags == TIMER_ABSTIME)
{
@ -76,11 +91,8 @@ clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
else if (__builtin_expect (flags, 0) != 0)
return EINVAL;
else if (clock_id != CLOCK_REALTIME)
{
/* Make sure the clock ID is correct. */
if (__builtin_expect (! CLOCK_P (clock_id), 0))
return EINVAL;
}
/* Not supported. */
return ENOTSUP;
return __builtin_expect (nanosleep (req, rem), 0) ? errno : 0;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
/* Copyright (C) 1999, 2000, 2001, 2002, 2003 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
@ -52,11 +52,22 @@ clock_settime (clockid_t clock_id, const struct timespec *tp)
switch (clock_id)
{
case CLOCK_REALTIME:
TIMESPEC_TO_TIMEVAL (&tv, tp);
#define HANDLE_REALTIME \
do { \
TIMESPEC_TO_TIMEVAL (&tv, tp); \
\
retval = settimeofday (&tv, NULL); \
while (0)
retval = settimeofday (&tv, NULL);
#ifdef SYSDEP_GETTIME
SYSDEP_GETTIME;
#endif
#ifndef HANDLED_REALTIME
case CLOCK_REALTIME:
HANDLE_REALTIME;
break;
#endif
#if HP_TIMING_AVAIL
case CLOCK_PROCESS_CPUTIME_ID:

View File

@ -0,0 +1,76 @@
/* Copyright (C) 2003 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 <sysdep.h>
#include "kernel-features.h"
#ifdef __ASSUME_POSIX_TIMERS
/* This means the REALTIME and MONOTONIC clock are definitely
supported in the kernel. */
# define SYSDEP_GETRES \
case CLOCK_REALTIME: \
case CLOCK_MONOTONIC: \
retval = INLINE_SYSCALL (clock_getres, 2, clock_id, res); \
break
#elif defined __NR_clock_getres
/* Is the syscall known to exist? */
extern int __libc_missing_posix_timers attribute_hidden;
/* The REALTIME and MONOTONIC clock might be available. Try the
syscall first. */
# define SYSDEP_GETRES \
case CLOCK_REALTIME: \
case CLOCK_MONOTONIC: \
{ \
int e = EINVAL; \
\
if (!__libc_missing_posix_timers) \
{ \
INTERNAL_SYSCALL_DECL (err); \
int r = INTERNAL_SYSCALL (clock_getres, err, 2, clock_id, res); \
if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \
{ \
retval = 0; \
break; \
} \
\
e = INTERNAL_SYSCALL_ERRNO (r, err); \
if (e == ENOSYS) \
{ \
__libc_missing_posix_timers = 1; \
e = EINVAL; \
} \
} \
\
/* Fallback code. */ \
if (e == EINVAL && clock_id == CLOCK_REALTIME) \
HANDLE_REALTIME; \
else \
__set_errno (e); \
} \
break
#endif
#ifdef __NR_clock_getres
/* We handled the REALTIME clock here. */
# define HANDLED_REALTIME 1
#endif
#include <sysdeps/posix/clock_getres.c>

View File

@ -0,0 +1,76 @@
/* Copyright (C) 2003 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 <sysdep.h>
#include "kernel-features.h"
#ifdef __ASSUME_POSIX_TIMERS
/* This means the REALTIME and MONOTONIC clock are definitely
supported in the kernel. */
# define SYSDEP_GETTIME \
case CLOCK_REALTIME: \
case CLOCK_MONOTONIC: \
retval = INLINE_SYSCALL (clock_gettime, 2, clock_id, tp); \
break
#elif defined __NR_clock_gettime
/* Is the syscall known to exist? */
int __libc_missing_posix_timers attribute_hidden;
/* The REALTIME and MONOTONIC clock might be available. Try the
syscall first. */
# define SYSDEP_GETTIME \
case CLOCK_REALTIME: \
case CLOCK_MONOTONIC: \
{ \
int e = EINVAL; \
\
if (!__libc_missing_posix_timers) \
{ \
INTERNAL_SYSCALL_DECL (err); \
int r = INTERNAL_SYSCALL (clock_gettime, err, 2, clock_id, tp); \
if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \
{ \
retval = 0; \
break; \
} \
\
e = INTERNAL_SYSCALL_ERRNO (r, err); \
if (e == ENOSYS) \
{ \
__libc_missing_posix_timers = 1; \
e = EINVAL; \
} \
} \
\
/* Fallback code. */ \
if (e == EINVAL && clock_id == CLOCK_REALTIME) \
HANDLE_REALTIME; \
else \
__set_errno (e); \
} \
break
#endif
#ifdef __NR_clock_gettime
/* We handled the REALTIME clock here. */
# define HANDLED_REALTIME 1
#endif
#include <sysdeps/unix/clock_gettime.c>

View File

@ -0,0 +1,65 @@
/* Copyright (C) 2003 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 <time.h>
#include <sysdep.h>
#include "kernel-features.h"
#ifdef __ASSUME_POSIX_TIMERS
/* We can simply use the syscall. The CPU clocks are not supported
with this function. */
int
clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
struct timespec *rem)
{
INTERNAL_SYSCALL_DECL (err);
int r;
r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem);
return (INTERNAL_SYSCALL_ERROR_P (r, err)
? INTERNAL_SYSCALL_ERRNO (r, err) : 0);
}
#else
# ifdef __NR_clock_nanosleep
/* Is the syscall known to exist? */
extern int __libc_missing_posix_timers attribute_hidden;
/* The REALTIME and MONOTONIC clock might be available. Try the
syscall first. */
# define SYSDEP_NANOSLEEP \
if (!__libc_missing_posix_timers) \
{ \
INTERNAL_SYSCALL_DECL (err); \
int r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, \
req, rem); \
\
if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \
return 0; \
\
if (INTERNAL_SYSCALL_ERRNO (r, err) != ENOSYS) \
return INTERNAL_SYSCALL_ERRNO (r, err); \
\
__libc_missing_posix_timers = 1; \
}
# endif
# include <sysdeps/unix/clock_nanosleep.c>
#endif

View File

@ -0,0 +1,73 @@
/* Copyright (C) 2003 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 <sysdep.h>
#include "kernel-features.h"
#ifdef __ASSUME_POSIX_TIMERS
/* This means the REALTIME clock is definitely supported in the
kernel. */
# define SYSDEP_SETTIME \
case CLOCK_REALTIME: \
retval = INLINE_SYSCALL (clock_settime, 2, clock_id, tp); \
break
#elif defined __NR_clock_settime
/* Is the syscall known to exist? */
extern int __libc_missing_posix_timers attribute_hidden;
/* The REALTIME clock might be available. Try the syscall first. */
# define SYSDEP_SETTIME \
case CLOCK_REALTIME: \
{ \
int e = EINVAL; \
\
if (!__libc_missing_posix_timers) \
{ \
INTERNAL_SYSCALL_DECL (err); \
int r = INTERNAL_SYSCALL (clock_settime, err, 2, clock_id, tp); \
if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \
{ \
retval = 0; \
break; \
} \
\
e = INTERNAL_SYSCALL_ERRNO (r, err); \
if (e == ENOSYS) \
{ \
__libc_missing_posix_timers = 1; \
e = EINVAL; \
} \
} \
\
/* Fallback code. */ \
if (e == EINVAL && clock_id == CLOCK_REALTIME) \
HANDLE_REALTIME; \
else \
__set_errno (e); \
} \
break
#endif
#ifdef __NR_clock_settime
/* We handled the REALTIME clock here. */
# define HANDLED_REALTIME 1
#endif
#include <sysdeps/unix/clock_settime.c>

View File

@ -1,6 +1,6 @@
/* Set flags signalling availability of kernel features based on given
kernel version number.
Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2001, 2002, 2003 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
@ -264,3 +264,9 @@
# define __ASSUME_FCNTL64 1
# define __ASSUME_VFORK_SYSCALL 1
#endif
/* Beginning with 2.5.63 support for realtime and monotonic clocks and
timers based on them is available. */
#if __LINUX_KERNEL_VERSION >= 132415
# define __ASSUME_POSIX_TIMERS 1
#endif

View File

@ -0,0 +1,51 @@
/* Get file-specific information about a file. Linux version.
Copyright (C) 2003 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 <sysdep.h>
#include <time.h>
#include <unistd.h>
static long int posix_sysconf (int name);
/* Define this first, so it can be inlined. */
#define __sysconf static posix_sysconf
#include <sysdeps/posix/sysconf.c>
/* Get the value of the system variable NAME. */
long int
__sysconf (int name)
{
switch (name)
{
#ifdef __NR_clock_getres
case _SC_MONOTONIC_CLOCK:
/* Check using the clock_getres system call. */
{
struct timespec ts;
INTERNAL_SYSCALL_DECL (err);
int r = INTERNAL_SYSCALL (clock_getres, err, 2, CLOCK_MONOTONIC, &ts);
return INTERNAL_SYSCALL_ERROR_P (r, err) ? 0 : 1;
}
#endif
default:
return posix_sysconf (name);
}
}