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: |