diff options
| author | Manuel Novoa III <mjn3@codepoet.org> | 2002-07-15 16:26:52 +0000 | 
|---|---|---|
| committer | Manuel Novoa III <mjn3@codepoet.org> | 2002-07-15 16:26:52 +0000 | 
| commit | c96a844f5209ee078b282b1bec690f80f7411ada (patch) | |
| tree | 19cd4a0fb42b17fbcc34304ae4ffa5385dccbdfd /libc | |
| parent | 8431a6f2e2585bbeb9de72939dd423b9f6a1d418 (diff) | |
Clean up CLK_TCK situation.  clock() and sysconf() now use an
arch-specific constant value defined in bits/uClibc_clk_tck.h.
Default is 100 (common/bits) but alpha uses 1024 following glibc.
Override per arch as necessary.
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/misc/time/time.c | 31 | ||||
| -rw-r--r-- | libc/sysdeps/linux/alpha/bits/uClibc_clk_tck.h | 8 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/bits/time.h | 12 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/bits/uClibc_clk_tck.h | 8 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i386/bits/time.h | 73 | ||||
| -rw-r--r-- | libc/sysdeps/linux/sparc/bits/time.h | 73 | ||||
| -rw-r--r-- | libc/unistd/sysconf.c | 9 | 
7 files changed, 49 insertions, 165 deletions
diff --git a/libc/misc/time/time.c b/libc/misc/time/time.c index e7e3b8414..d439de90c 100644 --- a/libc/misc/time/time.c +++ b/libc/misc/time/time.c @@ -93,14 +93,6 @@  #define TZNAME_MAX _POSIX_TZNAME_MAX  #endif -/* TODO - This stuff belongs in some include/bits/ file. */ -#undef CLK_TCK -#if (TARGET_ARCH == alpha) || (TARGET_ARCH == ia64) -#define CLK_TCK     1024 -#else -#define CLK_TCK     100 -#endif -  /* The era code is currently unfinished. */  /*  #define ENABLE_ERA_CODE */ @@ -315,19 +307,32 @@ clock_t clock(void)  	times(&xtms);  	t = ((unsigned long) xtms.tms_utime) + xtms.tms_stime; + +#ifndef __UCLIBC_CLK_TCK_CONST +#error __UCLIBC_CLK_TCK_CONST not defined! +#endif + +#undef CLK_TCK +#define CLK_TCK __UCLIBC_CLK_TCK_CONST + +#if CLK_TCK > CLOCKS_PER_SEC +#error __UCLIBC_CLK_TCK_CONST > CLOCKS_PER_SEC! +#elif CLK_TCK < 1 +#error __UCLIBC_CLK_TCK_CONST < 1! +#endif +  #if (CLK_TCK == CLOCKS_PER_SEC)  	return (t <= LONG_MAX) ? t : -1; -#elif (CLK_TCK == 1) || (CLK_TCK == 10) || (CLK_TCK == 100) || (CLK_TCK == 1000) +#elif (CLOCKS_PER_SEC % CLK_TCK) == 0  	return (t <= (LONG_MAX / (CLOCKS_PER_SEC/CLK_TCK)))  		? t * (CLOCKS_PER_SEC/CLK_TCK)  		: -1; -#elif (CLK_TCK == 1024) +#else  	return (t <= ((LONG_MAX / CLOCKS_PER_SEC) * CLK_TCK  				  + ((LONG_MAX % CLOCKS_PER_SEC) * CLK_TCK) / CLOCKS_PER_SEC)) -		? ((t >> 10) * CLOCKS_PER_SEC) + (((t & 1023) * CLOCKS_PER_SEC) >> 10) +		? (((t / CLK_TCK) * CLOCKS_PER_SEC) +		   + (((t % CLK_TCK) * CLOCKS_PER_SEC) / CLK_TCK))  		: -1; -#else -#error fix for CLK_TCK  #endif  } diff --git a/libc/sysdeps/linux/alpha/bits/uClibc_clk_tck.h b/libc/sysdeps/linux/alpha/bits/uClibc_clk_tck.h new file mode 100644 index 000000000..f7cd69aef --- /dev/null +++ b/libc/sysdeps/linux/alpha/bits/uClibc_clk_tck.h @@ -0,0 +1,8 @@ +/* Follow glibc's example and use 1024 for CLK_TCK to implement sysconf and + * clock.c instead of the normal default of 100. + * + * WARNING: It is assumed that this is a constant integer value usable in + * preprocessor conditionals!!! + */ + +#define __UCLIBC_CLK_TCK_CONST		1024 diff --git a/libc/sysdeps/linux/common/bits/time.h b/libc/sysdeps/linux/common/bits/time.h index 2a6873f00..e551c23a4 100644 --- a/libc/sysdeps/linux/common/bits/time.h +++ b/libc/sysdeps/linux/common/bits/time.h @@ -33,17 +33,25 @@     XSI-conformant systems. */  #  define CLOCKS_PER_SEC  1000000l +/* Get the arch-specific value of __UCLIBC_CLK_TCK_CONST used for CLK_TCK + * in sysconf() and clock(). */ +#include <bits/uClibc_clk_tck.h> +  #  if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K  /* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK     presents the real value for clock ticks per second for the system.  */  #   include <bits/types.h> -extern long int __sysconf (int); -#   define CLK_TCK ((__clock_t) __sysconf (2))	/* 2 is _SC_CLK_TCK */ +/* Note (uClibc): glibc #defines CLK_TCK as a sysconf() call. */ +#   define CLK_TCK ((__clock_t) __UCLIBC_CLK_TCK_CONST)  #  endif  #  ifdef __USE_POSIX199309  /* Identifier for system-wide realtime clock.  */  #   define CLOCK_REALTIME	0 +/* High-resolution timer from the CPU.  */ +#   define CLOCK_PROCESS_CPUTIME_ID	2 +/* Thread-specific CPU-time clock.  */ +#   define CLOCK_THREAD_CPUTIME_ID	3  /* Flag to indicate time is absolute.  */  #   define TIMER_ABSTIME	1 diff --git a/libc/sysdeps/linux/common/bits/uClibc_clk_tck.h b/libc/sysdeps/linux/common/bits/uClibc_clk_tck.h new file mode 100644 index 000000000..00b77bfc8 --- /dev/null +++ b/libc/sysdeps/linux/common/bits/uClibc_clk_tck.h @@ -0,0 +1,8 @@ +/* Use a default of 100 for CLK_TCK to implement sysconf() and clock(). + * Override this by supplying an arch-specific version of this header file. + * + * WARNING: It is assumed that this is a constant integer value usable in + * preprocessor conditionals!!! + */ + +#define __UCLIBC_CLK_TCK_CONST		100 diff --git a/libc/sysdeps/linux/i386/bits/time.h b/libc/sysdeps/linux/i386/bits/time.h deleted file mode 100644 index a1b1abc8f..000000000 --- a/libc/sysdeps/linux/i386/bits/time.h +++ /dev/null @@ -1,73 +0,0 @@ -/* System-dependent timing definitions.  Linux/x86 version. -   Copyright (C) 1996, 1997, 1999, 2000, 2001 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.  */ - -/* - * 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  1000000l - -#  if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K -/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK -   presents the real value for clock ticks per second for the system.  */ -#   include <bits/types.h> -extern long int __sysconf (int); -#   define CLK_TCK ((__clock_t) __sysconf (2))	/* 2 is _SC_CLK_TCK */ -#  endif - -#  ifdef __USE_POSIX199309 -/* Identifier for system-wide realtime clock.  */ -#   define CLOCK_REALTIME		0 -/* High-resolution timer from the CPU.  */ -#   define CLOCK_PROCESS_CPUTIME_ID	2 -/* Thread-specific CPU-time clock.  */ -#   define CLOCK_THREAD_CPUTIME_ID	3 - -/* 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 */ diff --git a/libc/sysdeps/linux/sparc/bits/time.h b/libc/sysdeps/linux/sparc/bits/time.h deleted file mode 100644 index 167cef79f..000000000 --- a/libc/sysdeps/linux/sparc/bits/time.h +++ /dev/null @@ -1,73 +0,0 @@ -/* System-dependent timing definitions.  Linux/SPARC version. -   Copyright (C) 1996, 1997, 1999, 2000, 2001 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.  */ - -/* - * 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  1000000l - -#  if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K -/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK -   presents the real value for clock ticks per second for the system.  */ -#   include <bits/types.h> -extern long int __sysconf (int); -#   define CLK_TCK ((__clock_t) __sysconf (2))	/* 2 is _SC_CLK_TCK */ -#  endif - -#  ifdef __USE_POSIX199309 -/* Identifier for system-wide realtime clock.  */ -#   define CLOCK_REALTIME		0 -/* High-resolution timer from the CPU.  */ -#   define CLOCK_PROCESS_CPUTIME_ID	2 -/* Thread-specific CPU-time clock.  */ -#   define CLOCK_THREAD_CPUTIME_ID	3 - -/* 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 */ diff --git a/libc/unistd/sysconf.c b/libc/unistd/sysconf.c index 66b40aa03..89f1e7573 100644 --- a/libc/unistd/sysconf.c +++ b/libc/unistd/sysconf.c @@ -31,8 +31,8 @@  #include <sys/types.h>  #include <regex.h> -#ifndef SYSTEM_CLK_TCK -# define SYSTEM_CLK_TCK 100 +#ifndef __UCLIBC_CLK_TCK_CONST +#error __UCLIBC_CLK_TCK_CONST not defined!  #endif  extern int getpagesize (void); @@ -94,7 +94,7 @@ long int __sysconf(int name)      case _SC_CLK_TCK:        /* Can't use CLK_TCK here since that calls __sysconf(_SC_CLK_TCK) */ -      return SYSTEM_CLK_TCK; +      return __UCLIBC_CLK_TCK_CONST;      case _SC_NGROUPS_MAX:  #ifdef	NGROUPS_MAX @@ -121,7 +121,8 @@ long int __sysconf(int name)  #if 0        RETURN_FUNCTION(tzname_max ());  #else -      RETURN_NEG_1; +/*       RETURN_NEG_1; */ +      return _POSIX_TZNAME_MAX;  #endif      case _SC_JOB_CONTROL:  | 
