Browse Source

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.

Manuel Novoa III 22 years ago
parent
commit
c96a844f52

+ 18 - 13
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
 }
 

+ 8 - 0
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

+ 10 - 2
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

+ 8 - 0
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

+ 0 - 73
libc/sysdeps/linux/i386/bits/time.h

@@ -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 */

+ 0 - 73
libc/sysdeps/linux/sparc/bits/time.h

@@ -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 */

+ 5 - 4
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: