summaryrefslogtreecommitdiff
path: root/ace/OS_NS_time.h
diff options
context:
space:
mode:
Diffstat (limited to 'ace/OS_NS_time.h')
-rw-r--r--ace/OS_NS_time.h317
1 files changed, 315 insertions, 2 deletions
diff --git a/ace/OS_NS_time.h b/ace/OS_NS_time.h
index fc532b41367..635e0a0e522 100644
--- a/ace/OS_NS_time.h
+++ b/ace/OS_NS_time.h
@@ -1,4 +1,317 @@
// -*- C++ -*-
-// $Id$
-// This is a placeholder.
+//=============================================================================
+/**
+ * @file OS_NS_time.h
+ *
+ * $Id$
+ *
+ * @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
+ * @author Jesper S. M|ller<stophph@diku.dk>
+ * @author and a cast of thousands...
+ *
+ * Originally in OS.h.
+ */
+//=============================================================================
+
+#ifndef ACE_OS_NS_TIME_H
+# define ACE_OS_NS_TIME_H
+
+# include /**/ "ace/pre.h"
+
+# include "ace/config-all.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/os_include/os_time.h"
+
+# if defined (ACE_HAS_BROKEN_R_ROUTINES)
+# undef ctime_r
+# undef asctime_r
+# endif /* ACE_HAS_BROKEN_R_ROUTINES */
+
+#include "ace/Basic_Types.h"
+
+// Type-safe, and unsigned.
+static const ACE_UINT32 ACE_U_ONE_SECOND_IN_MSECS = 1000U;
+static const ACE_UINT32 ACE_U_ONE_SECOND_IN_USECS = 1000000U;
+static const ACE_UINT32 ACE_U_ONE_SECOND_IN_NSECS = 1000000000U;
+
+#if defined (ACE_PSOS_HAS_TIME)
+
+// Use pSOS time, wrapped . . .
+class ACE_OS_Export ACE_PSOS_Time_t
+{
+public:
+ /// default ctor: date, time, and ticks all zeroed.
+ ACE_PSOS_Time_t (void);
+
+ /// ctor from a timespec_t
+ ACE_PSOS_Time_t (const timespec_t& t);
+
+ /// type cast operator (to a timespec_t)
+ operator timespec_t ();
+
+ /// static member function to get current system time
+ static u_long get_system_time (ACE_PSOS_Time_t& t);
+
+ /// static member function to set current system time
+ static u_long set_system_time (const ACE_PSOS_Time_t& t);
+
+# if defined (ACE_PSOSIM)
+ /// static member function to initialize system time, using UNIX calls
+ static u_long init_simulator_time (void);
+# endif /* ACE_PSOSIM */
+
+ /// max number of ticks supported in a single system call
+ static const u_long max_ticks;
+private:
+ // = Constants for prying info out of the pSOS time encoding.
+ static const u_long year_mask;
+ static const u_long month_mask;
+ static const u_long day_mask;
+ static const u_long hour_mask;
+ static const u_long minute_mask;
+ static const u_long second_mask;
+ static const int year_shift;
+ static const int month_shift;
+ static const int hour_shift;
+ static const int minute_shift;
+ static const int year_origin;
+ static const int month_origin;
+
+ // error codes
+ static const u_long err_notime; // system time not set
+ static const u_long err_illdate; // date out of range
+ static const u_long err_illtime; // time out of range
+ static const u_long err_illticks; // ticks out of range
+
+ /// date : year in bits 31-16, month in bits 15-8, day in bits 7-0
+ u_long date_;
+
+ /// time : hour in bits 31-16, minutes in bits 15-8, seconds in bits 7-0
+ u_long time_;
+
+ /// ticks: number of system clock ticks (KC_TICKS2SEC-1 max)
+ u_long ticks_;
+} ;
+#endif /* ACE_PSOS_HAS_TIME */
+
+#if defined (ACE_HAS_WINCE)
+ /// Supporting data for ctime and ctime_r functions on WinCE.
+ const wchar_t *day_of_week_name[7];
+ const wchar_t *month_name[12];
+
+// WinCE doesn't have most of the standard C library time functions. It
+// also doesn't define struct tm. SYSTEMTIME has pretty much the same
+// info though, so we can map it when needed. Define struct tm here and
+// use it when needed. This is taken from the standard C library.
+struct tm {
+ int tm_sec;
+ int tm_min;
+ int tm_hour;
+ int tm_mday; // Day of the month
+ int tm_mon;
+ int tm_year;
+ int tm_wday; // Day of the week
+ int tm_yday; // Day in the year
+ int tm_isdst; // >0 if dst in effet; 0 if not; <0 if unknown
+};
+#endif /* ACE_HAS_WINCE */
+
+/// Helper for the ACE_OS::timezone() function
+/**
+ * We put all the timezone stuff that used to be in ACE_OS::timezone()
+ * here because on some platforms "timezone" is a macro. Because of this,
+ * the name ACE_OS::timezone will cause errors. So in order to use the
+ * macro as it is defined but also keep the name ACE_OS::timezone, we
+ * use timezone first here in this inline function, and then undefine
+ * timezone.
+ */
+inline long ace_timezone()
+{
+#if !defined (VXWORKS) && !defined (ACE_PSOS) && !defined (CHORUS)
+# if defined (ACE_HAS_WINCE)
+ TIME_ZONE_INFORMATION tz;
+ GetTimeZoneInformation (&tz);
+ return tz.Bias * 60;
+# elif defined (ACE_WIN32)
+ return _timezone; // For Win32.
+# elif ( defined (__Lynx__) || defined (__FreeBSD__) || defined (ACE_HAS_SUNOS4_GETTIMEOFDAY) ) && ( !defined (__linux__) )
+ long result = 0;
+ struct timeval time;
+ struct timezone zone;
+ ACE_UNUSED_ARG (result);
+ ACE_OSCALL (::gettimeofday (&time, &zone), int, -1, result);
+ return zone.tz_minuteswest * 60;
+# else /* __Lynx__ || __FreeBSD__ ... */
+# if defined (__linux__)
+ // Under Linux, gettimeofday() does not correctly set the timezone
+ // struct, so we should use the global variable <timezone>.
+ // However, it is initialized by tzset(). I assume other systems
+ // are the same (i.e., tzset() needs to be called to set
+ // <timezone>), but since no one is complaining, I will only make
+ // the change for Linux.
+ ::tzset();
+# endif
+ return timezone;
+# endif /* __Lynx__ || __FreeBSD__ ... */
+#else
+ ACE_NOTSUP_RETURN (0);
+#endif /* !ACE_HAS_WINCE && !VXWORKS && !ACE_PSOS */
+}
+
+
+#if !defined (ACE_LACKS_DIFFTIME)
+/// Helper for the ACE_OS::difftime() function
+/**
+ * We moved the difftime code that used to be in ACE_OS::difftime()
+ * here because on some platforms "difftime" is a macro. Because of this,
+ * the name ACE_OS::difftime will cause errors. So in order to use the
+ * macro as it is defined but also keep the name ACE_OS::difftime, we
+ * use difftime first here in this inline function, and then undefine
+ * it.
+ */
+inline double ace_difftime(time_t t1, time_t t0)
+{
+# if defined (ACE_PSOS) && ! defined (ACE_PSOS_HAS_TIME)
+ // simulate difftime ; just subtracting ; ACE_PSOS case
+ return ((double)t1) - ((double)t0);
+# else
+ return difftime (t1, t0);
+# endif /* ACE_PSOS !ACE_PSOS_HAS_TIME */
+}
+#endif /* !ACE_LACKS_DIFFTIME */
+
+# if defined (ACE_WIN32)
+# if !defined (ACE_LACKS_LONGLONG_T)
+// 64-bit quad-word definitions.
+typedef unsigned __int64 ACE_QWORD;
+typedef unsigned __int64 ACE_hrtime_t;
+inline ACE_QWORD ACE_MAKE_QWORD (DWORD lo, DWORD hi) { return ACE_QWORD (lo) | (ACE_QWORD (hi) << 32); }
+inline DWORD ACE_LOW_DWORD (ACE_QWORD q) { return (DWORD) q; }
+inline DWORD ACE_HIGH_DWORD (ACE_QWORD q) { return (DWORD) (q >> 32); }
+# else
+// Can't find ANY place that ACE_QWORD is used, but hrtime_t is.
+typedef ACE_UINT64 ACE_hrtime_t;
+# endif // ACE_LACKS_LONGLONG_T
+# elif defined (ACE_PSOS)
+typedef ACE_UINT64 ACE_hrtime_t;
+# else /* !ACE_WIN32 && !ACE_PSOS */
+# if defined (ACE_HAS_HI_RES_TIMER) && !defined (ACE_LACKS_LONGLONG_T)
+ /* hrtime_t is defined on systems (Suns) with ACE_HAS_HI_RES_TIMER */
+ typedef hrtime_t ACE_hrtime_t;
+# else /* ! ACE_HAS_HI_RES_TIMER || ACE_LACKS_LONGLONG_T */
+ typedef ACE_UINT64 ACE_hrtime_t;
+# endif /* ! ACE_HAS_HI_RES_TIMER || ACE_LACKS_LONGLONG_T */
+# endif /* ACE_WIN32 */
+
+
+
+namespace ACE_OS {
+
+# if defined (CHORUS) && !defined (CHORUS_4)
+ // We must format this code as follows to avoid confusing OSE.
+ enum ACE_HRTimer_Op
+ {
+ ACE_HRTIMER_START = K_BSTART,
+ ACE_HRTIMER_INCR = K_BPOINT,
+ ACE_HRTIMER_STOP = K_BSTOP,
+ ACE_HRTIMER_GETTIME = 0xFFFF
+ };
+# else /* ! CHORUS */
+ enum ACE_HRTimer_Op
+ {
+ ACE_HRTIMER_START = 0x0, // Only use these if you can stand
+ ACE_HRTIMER_INCR = 0x1, // for interrupts to be disabled during
+ ACE_HRTIMER_STOP = 0x2, // the timed interval!!!!
+ ACE_HRTIMER_GETTIME = 0xFFFF
+ };
+# endif /* ! CHORUS */
+
+ //@{ @name A set of wrappers for operations on time.
+
+ char *asctime (const struct tm *tm);
+
+ char *asctime_r (const struct tm *tm,
+ char *buf, int buflen);
+
+ int clock_gettime (clockid_t,
+ struct timespec *);
+
+ ACE_TCHAR *ctime (const time_t *t);
+
+ ACE_TCHAR *ctime_r (const time_t *clock, ACE_TCHAR *buf, int buflen);
+
+# if defined (difftime)
+# undef difftime
+# endif /* difftime */
+
+ double difftime (time_t t1,
+ time_t t0);
+
+ ACE_hrtime_t gethrtime (const ACE_HRTimer_Op = ACE_HRTIMER_GETTIME);
+
+ struct tm *gmtime (const time_t *clock);
+
+ struct tm *gmtime_r (const time_t *clock,
+ struct tm *res);
+
+ struct tm *localtime (const time_t *clock);
+
+ struct tm *localtime_r (const time_t *clock,
+ struct tm *res);
+
+ // Get the current time.
+ time_t mktime (struct tm *timeptr);
+
+ int nanosleep (const struct timespec *requested,
+ struct timespec *remaining = 0);
+
+# if defined (ACE_HAS_POWERPC_TIMER) && (defined (ghs) || defined (__GNUG__))
+ void readPPCTimeBase (u_long &most,
+ u_long &least);
+# endif /* ACE_HAS_POWERPC_TIMER && (ghs or __GNUG__) */
+
+ size_t strftime (char *s,
+ size_t maxsize,
+ const char *format,
+ const struct tm *timeptr);
+
+#if defined (ACE_HAS_STRPTIME)
+ char *strptime (char *buf,
+ const char *format,
+ struct tm *tm);
+
+# if defined (ACE_LACKS_NATIVE_STRPTIME)
+ int strptime_getnum (char *buf, int *num, int *bi,
+ int *fi, int min, int max);
+# endif /* ACE_LACKS_NATIVE_STRPTIME */
+#endif /* ACE_HAS_STRPTIME */
+
+ time_t time (time_t *tloc = 0);
+
+# if defined (timezone)
+# undef timezone
+# endif /* timezone */
+
+ long timezone (void);
+
+ // wrapper for time zone information.
+ void tzset (void);
+
+ //@}
+} /* namespace ACE_OS */
+
+# if defined (ACE_HAS_INLINED_OSCALLS)
+# if defined (ACE_INLINE)
+# undef ACE_INLINE
+# endif /* ACE_INLINE */
+# define ACE_INLINE inline
+# include "ace/OS_NS_time.inl"
+# endif /* ACE_HAS_INLINED_OSCALLS */
+
+# include /**/ "ace/post.h"
+#endif /* ACE_OS_NS_TIME_H */