Testing monotonic clock

Hasso Tepper hasso at estpak.ee
Tue Apr 8 03:00:54 PDT 2008


Matthew Dillon wrote:
> I'm sure you will come up with a solution, even if it kills you. 
> My one consolation is that I am putting it on your shoulders to solve
> :-)

I hate when it happens ;).

OK, I ended up bringing in some changes from FreeBSD - I verified these 
and these make perfect sense. I haven't verified yet what it breaks in 
our tree :).

The source of the problem seems to be the stuff we have in sys/_posix.h. 
Besides being buggy, using these defines doesn't make sense IMHO. 
Volunteers to review (and kill?) it?

* There is more POSIX standards than 1003.1b-1993 which should be used in 
  ifdefs.
* Using '#ifndef _ANSI_SOURCE' doesn't make sense if __POSIX_VISIBLE is 
  already used in ifdefs - __POSIX_VISIBLE is 0 if _ANSI_SOURCE is defined 
  (sys/cdefs.h).

The patch is attached.


PS. In progress I realized that the configure test which started this is 
buggy as well ... ARGH!

-- 
Hasso Tepper
diff --git a/include/time.h b/include/time.h
--- a/include/time.h
+++ b/include/time.h
@@ -42,16 +42,18 @@
 #ifndef _TIME_H_
 #define	_TIME_H_
 
+#include <sys/cdefs.h>
+
 #ifndef _MACHINE_STDINT_H_
 #include <machine/stdint.h>
 #endif
 #include <machine/uvparam.h>
 #include <sys/_posix.h>
 
-#ifndef _ANSI_SOURCE
+#if __POSIX_VISIBLE > 0 && __POSIX_VISIBLE < 200112 || __BSD_VISIBLE
 /*
  * Frequency of the clock ticks reported by times().  Deprecated - use
- * sysconf(_SC_CLK_TCK) instead.
+ * sysconf(_SC_CLK_TCK) instead.  (Removed in 1003.1-2001.)
  */
 #define	CLK_TCK		_BSD_CLK_TCK_
 #endif
@@ -73,21 +75,18 @@
 typedef	__time_t	time_t;
 #endif
 
-/* XXX I'm not sure if _ANSI_SOURCE is playing properly
- *     with the setups in _posix.h:
- */
-#if !defined(_ANSI_SOURCE) && defined(_P1003_1B_VISIBLE_HISTORICALLY)
+#ifndef _SIZE_T_DECLARED
+#define _SIZE_T_DECLARED
+typedef	__size_t	size_t;
+#endif
+
+#if __POSIX_VISIBLE >= 199309
 /*
  * New in POSIX 1003.1b-1993.
  */
 #ifndef _CLOCKID_T_DECLARED
 #define _CLOCKID_T_DECLARED
 typedef	__clockid_t	clockid_t;
-#endif
-
-#ifndef _SIZE_T_DECLARED
-#define _SIZE_T_DECLARED
-typedef	__size_t	size_t;
 #endif
 
 #ifndef _TIMER_T_DECLARED
@@ -102,7 +101,24 @@
 	long	tv_nsec;	/* and nanoseconds */
 };
 #endif
-#endif /* Neither ANSI nor POSIX */
+#endif /* __POSIX_VISIBLE >= 199309 */
+
+/* These macros are also in sys/time.h. */
+#if !defined(CLOCK_REALTIME) && __POSIX_VISIBLE >= 200112
+#define CLOCK_REALTIME  0
+#ifdef __BSD_VISIBLE
+#define CLOCK_VIRTUAL	1
+#define CLOCK_PROF	2
+#endif
+#define CLOCK_MONOTONIC	4
+#endif /* !defined(CLOCK_REALTIME) && __POSIX_VISIBLE >= 200112 */
+
+#if !defined(TIMER_ABSTIME) && __POSIX_VISIBLE >= 200112
+#if __BSD_VISIBLE
+#define TIMER_RELTIME	0x0	/* relative timer */
+#endif
+#define TIMER_ABSTIME	0x1	/* absolute timer */
+#endif
 
 struct tm {
 	int	tm_sec;		/* seconds after the minute [0-60] */
@@ -118,9 +134,7 @@
 	char	*tm_zone;	/* timezone abbreviation */
 };
 
-#include <sys/cdefs.h>
-
-#ifndef	_ANSI_SOURCE
+#if __POSIX_VISIBLE
 extern char *tzname[];
 #endif
 
@@ -135,29 +149,35 @@
 size_t strftime (char *, size_t, const char *, const struct tm *);
 time_t time (time_t *);
 
-#ifndef _ANSI_SOURCE
+#if __POSIX_VISIBLE
 void tzset (void);
-#endif /* not ANSI */
+#endif
 
-#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
+#if __POSIX_VISIBLE >= 199506
 char *asctime_r (const struct tm *, char *);
 char *ctime_r (const time_t *, char *);
 struct tm *gmtime_r (const time_t *, struct tm *);
 struct tm *localtime_r (const time_t *, struct tm *);
-char *strptime (const char *, const char *, struct tm *);
-char *timezone (int, int);
-void tzsetwall (void);
-time_t timelocal (struct tm * const);
-time_t timegm (struct tm * const);
-#endif /* neither ANSI nor POSIX */
+#endif
 
-#if !defined(_ANSI_SOURCE) && defined(_P1003_1B_VISIBLE_HISTORICALLY)
+#if __POSIX_VISIBLE >= 199309
 /* Introduced in POSIX 1003.1b-1993, not part of 1003.1-1990. */
 int clock_getres (clockid_t, struct timespec *);
 int clock_gettime (clockid_t, struct timespec *);
 int clock_settime (clockid_t, const struct timespec *);
 int nanosleep (const struct timespec *, struct timespec *);
-#endif /* neither ANSI nor POSIX */
+#endif /* __POSIX_VISIBLE >= 199309 */
+
+#if __XSI_VISIBLE
+char *strptime (const char *, const char *, struct tm *);
+#endif
+
+#if __BSD_VISIBLE
+char *timezone (int, int);
+void tzsetwall (void);
+time_t timelocal (struct tm * const);
+time_t timegm (struct tm * const);
+#endif /* __BSD_VISIBLE */
 __END_DECLS
 
 #endif /* !_TIME_H_ */




More information about the Kernel mailing list