summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/misc/time/time.c31
-rw-r--r--libc/sysdeps/linux/alpha/bits/uClibc_clk_tck.h8
-rw-r--r--libc/sysdeps/linux/common/bits/time.h12
-rw-r--r--libc/sysdeps/linux/common/bits/uClibc_clk_tck.h8
-rw-r--r--libc/sysdeps/linux/i386/bits/time.h73
-rw-r--r--libc/sysdeps/linux/sparc/bits/time.h73
-rw-r--r--libc/unistd/sysconf.c9
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: