From 173a5ddc77ceb29b7a0dba6d9feeea95ebbbd72b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 27 Nov 2011 19:50:27 +0000 Subject: [PATCH] No changes, just move time functions from wx/stopwatch.h to wx/time.h. Preserve compatibility by including wx/time.h from wx/stopwatch.h but put all the time-related functions in a more logical place. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69838 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/stopwatch.h | 41 -------- include/wx/time.h | 39 ++++++++ interface/wx/stopwatch.h | 56 ----------- interface/wx/time.h | 49 ++++++++++ src/common/stopwatch.cpp | 202 +------------------------------------- src/common/time.cpp | 206 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 296 insertions(+), 297 deletions(-) diff --git a/include/wx/stopwatch.h b/include/wx/stopwatch.h index 791eda9506..9ef3b1fc05 100644 --- a/include/wx/stopwatch.h +++ b/include/wx/stopwatch.h @@ -102,45 +102,4 @@ private: #endif // wxUSE_LONGLONG && WXWIN_COMPATIBILITY_2_6 -// ---------------------------------------------------------------------------- -// global time functions -// ---------------------------------------------------------------------------- - -// Get number of seconds since local time 00:00:00 Jan 1st 1970. -extern long WXDLLIMPEXP_BASE wxGetLocalTime(); - -// Get number of seconds since GMT 00:00:00, Jan 1st 1970. -extern long WXDLLIMPEXP_BASE wxGetUTCTime(); - -#if wxUSE_LONGLONG - typedef wxLongLong wxMilliClock_t; - inline long wxMilliClockToLong(wxLongLong ll) { return ll.ToLong(); } -#else - typedef double wxMilliClock_t; - inline long wxMilliClockToLong(double d) { return wx_truncate_cast(long, d); } -#endif // wxUSE_LONGLONG - -// Get number of milliseconds since local time 00:00:00 Jan 1st 1970 -extern wxMilliClock_t WXDLLIMPEXP_BASE wxGetLocalTimeMillis(); - -#if wxUSE_LONGLONG - -// Get the number of milliseconds or microseconds since the Epoch. -wxLongLong WXDLLIMPEXP_BASE wxGetUTCTimeMillis(); -wxLongLong WXDLLIMPEXP_BASE wxGetUTCTimeUSec(); - -#endif // wxUSE_LONGLONG - -#define wxGetCurrentTime() wxGetLocalTime() - -// on some really old systems gettimeofday() doesn't have the second argument, -// define wxGetTimeOfDay() to hide this difference -#ifdef HAVE_GETTIMEOFDAY - #ifdef WX_GETTIMEOFDAY_NO_TZ - #define wxGetTimeOfDay(tv) gettimeofday(tv) - #else - #define wxGetTimeOfDay(tv) gettimeofday((tv), NULL) - #endif -#endif // HAVE_GETTIMEOFDAY - #endif // _WX_STOPWATCH_H_ diff --git a/include/wx/time.h b/include/wx/time.h index 29ca1029cb..d6ff8ba04e 100644 --- a/include/wx/time.h +++ b/include/wx/time.h @@ -11,7 +11,46 @@ #ifndef _WX_TIME_H_ #define _WX_TIME_H_ +#include "wx/longlong.h" + // Returns the difference between UTC and local time in seconds. WXDLLIMPEXP_BASE int wxGetTimeZone(); +// Get number of seconds since local time 00:00:00 Jan 1st 1970. +extern long WXDLLIMPEXP_BASE wxGetLocalTime(); + +// Get number of seconds since GMT 00:00:00, Jan 1st 1970. +extern long WXDLLIMPEXP_BASE wxGetUTCTime(); + +#if wxUSE_LONGLONG + typedef wxLongLong wxMilliClock_t; + inline long wxMilliClockToLong(wxLongLong ll) { return ll.ToLong(); } +#else + typedef double wxMilliClock_t; + inline long wxMilliClockToLong(double d) { return wx_truncate_cast(long, d); } +#endif // wxUSE_LONGLONG + +// Get number of milliseconds since local time 00:00:00 Jan 1st 1970 +extern wxMilliClock_t WXDLLIMPEXP_BASE wxGetLocalTimeMillis(); + +#if wxUSE_LONGLONG + +// Get the number of milliseconds or microseconds since the Epoch. +wxLongLong WXDLLIMPEXP_BASE wxGetUTCTimeMillis(); +wxLongLong WXDLLIMPEXP_BASE wxGetUTCTimeUSec(); + +#endif // wxUSE_LONGLONG + +#define wxGetCurrentTime() wxGetLocalTime() + +// on some really old systems gettimeofday() doesn't have the second argument, +// define wxGetTimeOfDay() to hide this difference +#ifdef HAVE_GETTIMEOFDAY + #ifdef WX_GETTIMEOFDAY_NO_TZ + #define wxGetTimeOfDay(tv) gettimeofday(tv) + #else + #define wxGetTimeOfDay(tv) gettimeofday((tv), NULL) + #endif +#endif // HAVE_GETTIMEOFDAY + #endif // _WX_TIME_H_ diff --git a/interface/wx/stopwatch.h b/interface/wx/stopwatch.h index 3e37dacd1f..644db85d36 100644 --- a/interface/wx/stopwatch.h +++ b/interface/wx/stopwatch.h @@ -84,59 +84,3 @@ public: wxLongLong TimeInMicro() const; }; - - -// ============================================================================ -// Global functions/macros -// ============================================================================ - -/** @addtogroup group_funcmacro_time */ -//@{ - -/** - Returns the number of seconds since local time 00:00:00 Jan 1st 1970. - - @see wxDateTime::Now() - - @header{wx/stopwatch.h} -*/ -long wxGetLocalTime(); - -/** - Returns the number of milliseconds since local time 00:00:00 Jan 1st 1970. - - The use of wxGetUTCTimeMillis() is preferred as it provides a usually - (except for changes to the system time) monotonic clock which the local - time also changes whenever DST begins or ends. - - @see wxDateTime::Now(), wxGetUTCTimeMillis(), wxGetUTCTimeUSec() - - @header{wx/stopwatch.h} -*/ -wxLongLong wxGetLocalTimeMillis(); - -/** - Returns the number of seconds since GMT 00:00:00 Jan 1st 1970. - - @see wxDateTime::Now() - - @header{wx/stopwatch.h} -*/ -long wxGetUTCTime(); - -/** - Returns the number of milliseconds since GMT 00:00:00 Jan 1st 1970. - - @since 2.9.3 - */ -wxLongLong wxGetUTCTimeMillis(); - -/** - Returns the number of microseconds since GMT 00:00:00 Jan 1st 1970. - - @since 2.9.3 - */ -wxLongLong wxGetUTCTimeUSec(); - -//@} - diff --git a/interface/wx/time.h b/interface/wx/time.h index 23db295696..ad833b2021 100644 --- a/interface/wx/time.h +++ b/interface/wx/time.h @@ -18,4 +18,53 @@ */ int wxGetTimeZone(); +/** + Returns the number of seconds since local time 00:00:00 Jan 1st 1970. + + @see wxDateTime::Now() + + @header{wx/time.h} +*/ +long wxGetLocalTime(); + +/** + Returns the number of milliseconds since local time 00:00:00 Jan 1st 1970. + + The use of wxGetUTCTimeMillis() is preferred as it provides a usually + (except for changes to the system time) monotonic clock which the local + time also changes whenever DST begins or ends. + + @see wxDateTime::Now(), wxGetUTCTimeMillis(), wxGetUTCTimeUSec() + + @header{wx/time.h} +*/ +wxLongLong wxGetLocalTimeMillis(); + +/** + Returns the number of seconds since GMT 00:00:00 Jan 1st 1970. + + @see wxDateTime::Now() + + @header{wx/time.h} +*/ +long wxGetUTCTime(); + +/** + Returns the number of milliseconds since GMT 00:00:00 Jan 1st 1970. + + @header{wx/time.h} + + @since 2.9.3 + */ +wxLongLong wxGetUTCTimeMillis(); + +/** + Returns the number of microseconds since GMT 00:00:00 Jan 1st 1970. + + @header{wx/time.h} + + @since 2.9.3 + */ +wxLongLong wxGetUTCTimeUSec(); + //@} diff --git a/src/common/stopwatch.cpp b/src/common/stopwatch.cpp index 67863bd0a7..476237c9cf 100644 --- a/src/common/stopwatch.cpp +++ b/src/common/stopwatch.cpp @@ -30,57 +30,15 @@ #include "wx/stopwatch.h" +#if wxUSE_STOPWATCH + #ifndef WX_PRECOMP #ifdef __WXMSW__ #include "wx/msw/wrapwin.h" #endif - #include "wx/intl.h" #include "wx/log.h" #endif //WX_PRECOMP -// ---------------------------------------------------------------------------- -// System headers -// ---------------------------------------------------------------------------- - -#if defined(__VISAGECPP__) && !defined(HAVE_FTIME) - #define HAVE_FTIME -# if __IBMCPP__ >= 400 - # define ftime(x) _ftime(x) -# endif -#endif - -#if defined(__MWERKS__) && defined(__WXMSW__) -# undef HAVE_FTIME -# undef HAVE_GETTIMEOFDAY -#endif - -#ifndef __WXPALMOS5__ -#ifndef __WXWINCE__ -#include -#else -#include "wx/msw/private.h" -#include "wx/msw/wince/time.h" -#endif -#endif // __WXPALMOS5__ - - -#if !defined(__WXMAC__) && !defined(__WXWINCE__) - #include // for time_t -#endif - -#if defined(HAVE_GETTIMEOFDAY) - #include - #include -#elif defined(HAVE_FTIME) - #include -#endif - -#ifdef __WXPALMOS__ - #include - #include - #include -#endif - // ============================================================================ // implementation // ============================================================================ @@ -89,8 +47,6 @@ // wxStopWatch // ---------------------------------------------------------------------------- -#if wxUSE_STOPWATCH - namespace { @@ -218,157 +174,3 @@ long wxGetElapsedTime(bool resetTimer) } #endif // wxUSE_LONGLONG - -// ---------------------------------------------------------------------------- -// the functions to get the current time and timezone info -// ---------------------------------------------------------------------------- - -// Get local time as seconds since 00:00:00, Jan 1st 1970 -long wxGetLocalTime() -{ - struct tm tm; - time_t t0, t1; - - // This cannot be made static because mktime can overwrite it. - // - memset(&tm, 0, sizeof(tm)); - tm.tm_year = 70; - tm.tm_mon = 0; - tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_isdst = -1; // let mktime guess - - // Note that mktime assumes that the struct tm contains local time. - // - t1 = time(&t1); // now - t0 = mktime(&tm); // origin - - // Return the difference in seconds. - // - if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) - return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); - - wxLogSysError(_("Failed to get the local system time")); - return -1; -} - -// Get UTC time as seconds since 00:00:00, Jan 1st 1970 -long wxGetUTCTime() -{ - return (long)time(NULL); -} - -#if wxUSE_LONGLONG - -wxLongLong wxGetUTCTimeUSec() -{ -#if defined(__WXMSW__) - FILETIME ft; - ::GetSystemTimeAsFileTime(&ft); - - // FILETIME is in 100ns or 0.1us since 1601-01-01, transform to us since - // 1970-01-01. - wxLongLong t(ft.dwHighDateTime, ft.dwLowDateTime); - t /= 10; - t -= wxLL(11644473600000000); // Unix - Windows epochs difference in us. - return t; -#else // non-MSW - -#ifdef HAVE_GETTIMEOFDAY - timeval tv; - if ( wxGetTimeOfDay(&tv) != -1 ) - { - wxLongLong val(tv.tv_sec); - val *= MICROSECONDS_PER_SECOND; - val += tv.tv_usec; - return val; - } -#endif // HAVE_GETTIMEOFDAY - - // Fall back to lesser precision function. - return wxGetUTCTimeMillis()*1000; -#endif // MSW/!MSW -} - -// Get local time as milliseconds since 00:00:00, Jan 1st 1970 -wxLongLong wxGetUTCTimeMillis() -{ - wxLongLong val = 1000l; - - // If possible, use a function which avoids conversions from - // broken-up time structures to milliseconds -#if defined(__WXPALMOS__) - DateTimeType thenst; - thenst.second = 0; - thenst.minute = 0; - thenst.hour = 0; - thenst.day = 1; - thenst.month = 1; - thenst.year = 1970; - thenst.weekDay = 5; - uint32_t now = TimGetSeconds(); - uint32_t then = TimDateTimeToSeconds (&thenst); - return SysTimeToMilliSecs(SysTimeInSecs(now - then)); -#elif defined(__WXMSW__) - FILETIME ft; - ::GetSystemTimeAsFileTime(&ft); - - // FILETIME is expressed in 100ns (or 0.1us) units since 1601-01-01, - // transform them to ms since 1970-01-01. - wxLongLong t(ft.dwHighDateTime, ft.dwLowDateTime); - t /= 10000; - t -= wxLL(11644473600000); // Unix - Windows epochs difference in ms. - return t; -#elif defined(HAVE_GETTIMEOFDAY) - struct timeval tp; - if ( wxGetTimeOfDay(&tp) != -1 ) - { - val *= tp.tv_sec; - return (val + (tp.tv_usec / 1000)); - } - else - { - wxLogError(_("wxGetTimeOfDay failed.")); - return 0; - } -#elif defined(HAVE_FTIME) - struct timeb tp; - - // ftime() is void and not int in some mingw32 headers, so don't - // test the return code (well, it shouldn't fail anyhow...) - (void)::ftime(&tp); - val *= tp.time; - return (val + tp.millitm); -#else // no gettimeofday() nor ftime() - // If your platform/compiler does not support ms resolution please - // do NOT just shut off these warnings, drop me a line instead at - // - - #if defined(__VISUALC__) || defined (__WATCOMC__) - #pragma message("wxStopWatch will be up to second resolution!") - #elif defined(__BORLANDC__) - #pragma message "wxStopWatch will be up to second resolution!" - #else - #warning "wxStopWatch will be up to second resolution!" - #endif // compiler - - val *= wxGetUTCTime(); - return val; -#endif // time functions -} - -wxLongLong wxGetLocalTimeMillis() -{ - return wxGetUTCTimeMillis() - wxGetTimeZone()*MILLISECONDS_PER_SECOND; -} - -#else // !wxUSE_LONGLONG - -double wxGetLocalTimeMillis(void) -{ - return (double(clock()) / double(CLOCKS_PER_SEC)) * 1000.0; -} - -#endif // wxUSE_LONGLONG/!wxUSE_LONGLONG diff --git a/src/common/time.cpp b/src/common/time.cpp index d3e1bd6193..3b60d27438 100644 --- a/src/common/time.cpp +++ b/src/common/time.cpp @@ -25,6 +25,14 @@ #include "wx/time.h" +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" + #endif + #include "wx/intl.h" + #include "wx/log.h" +#endif + #ifndef WX_GMTOFF_IN_TM // Define it for some systems which don't (always) use configure but are // known to have tm_gmtoff field. @@ -33,6 +41,54 @@ #endif #endif +#if defined(__VISAGECPP__) && !defined(HAVE_FTIME) + #define HAVE_FTIME +# if __IBMCPP__ >= 400 + # define ftime(x) _ftime(x) +# endif +#endif + +#if defined(__MWERKS__) && defined(__WXMSW__) +# undef HAVE_FTIME +# undef HAVE_GETTIMEOFDAY +#endif + +#ifndef __WXPALMOS5__ +#ifndef __WXWINCE__ +#include +#else +#include "wx/msw/private.h" +#include "wx/msw/wince/time.h" +#endif +#endif // __WXPALMOS5__ + + +#if !defined(__WXMAC__) && !defined(__WXWINCE__) + #include // for time_t +#endif + +#if defined(HAVE_GETTIMEOFDAY) + #include + #include +#elif defined(HAVE_FTIME) + #include +#endif + +#ifdef __WXPALMOS__ + #include + #include + #include +#endif + +namespace +{ + +const int MILLISECONDS_PER_SECOND = 1000; +const int MICROSECONDS_PER_MILLISECOND = 1000; +const int MICROSECONDS_PER_SECOND = 1000*1000; + +} // anonymous namespace + // ============================================================================ // implementation // ============================================================================ @@ -98,3 +154,153 @@ int wxGetTimeZone() return timezone; #endif // WX_GMTOFF_IN_TM/!WX_GMTOFF_IN_TM } + +// Get local time as seconds since 00:00:00, Jan 1st 1970 +long wxGetLocalTime() +{ + struct tm tm; + time_t t0, t1; + + // This cannot be made static because mktime can overwrite it. + // + memset(&tm, 0, sizeof(tm)); + tm.tm_year = 70; + tm.tm_mon = 0; + tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; // let mktime guess + + // Note that mktime assumes that the struct tm contains local time. + // + t1 = time(&t1); // now + t0 = mktime(&tm); // origin + + // Return the difference in seconds. + // + if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) + return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); + + wxLogSysError(_("Failed to get the local system time")); + return -1; +} + +// Get UTC time as seconds since 00:00:00, Jan 1st 1970 +long wxGetUTCTime() +{ + return (long)time(NULL); +} + +#if wxUSE_LONGLONG + +wxLongLong wxGetUTCTimeUSec() +{ +#if defined(__WXMSW__) + FILETIME ft; + ::GetSystemTimeAsFileTime(&ft); + + // FILETIME is in 100ns or 0.1us since 1601-01-01, transform to us since + // 1970-01-01. + wxLongLong t(ft.dwHighDateTime, ft.dwLowDateTime); + t /= 10; + t -= wxLL(11644473600000000); // Unix - Windows epochs difference in us. + return t; +#else // non-MSW + +#ifdef HAVE_GETTIMEOFDAY + timeval tv; + if ( wxGetTimeOfDay(&tv) != -1 ) + { + wxLongLong val(tv.tv_sec); + val *= MICROSECONDS_PER_SECOND; + val += tv.tv_usec; + return val; + } +#endif // HAVE_GETTIMEOFDAY + + // Fall back to lesser precision function. + return wxGetUTCTimeMillis()*MICROSECONDS_PER_MILLISECOND; +#endif // MSW/!MSW +} + +// Get local time as milliseconds since 00:00:00, Jan 1st 1970 +wxLongLong wxGetUTCTimeMillis() +{ + wxLongLong val = MILLISECONDS_PER_SECOND; + + // If possible, use a function which avoids conversions from + // broken-up time structures to milliseconds +#if defined(__WXPALMOS__) + DateTimeType thenst; + thenst.second = 0; + thenst.minute = 0; + thenst.hour = 0; + thenst.day = 1; + thenst.month = 1; + thenst.year = 1970; + thenst.weekDay = 5; + uint32_t now = TimGetSeconds(); + uint32_t then = TimDateTimeToSeconds (&thenst); + return SysTimeToMilliSecs(SysTimeInSecs(now - then)); +#elif defined(__WXMSW__) + FILETIME ft; + ::GetSystemTimeAsFileTime(&ft); + + // FILETIME is expressed in 100ns (or 0.1us) units since 1601-01-01, + // transform them to ms since 1970-01-01. + wxLongLong t(ft.dwHighDateTime, ft.dwLowDateTime); + t /= 10000; + t -= wxLL(11644473600000); // Unix - Windows epochs difference in ms. + return t; +#elif defined(HAVE_GETTIMEOFDAY) + struct timeval tp; + if ( wxGetTimeOfDay(&tp) != -1 ) + { + val *= tp.tv_sec; + return (val + (tp.tv_usec / MICROSECONDS_PER_MILLISECOND)); + } + else + { + wxLogError(_("wxGetTimeOfDay failed.")); + return 0; + } +#elif defined(HAVE_FTIME) + struct timeb tp; + + // ftime() is void and not int in some mingw32 headers, so don't + // test the return code (well, it shouldn't fail anyhow...) + (void)::ftime(&tp); + val *= tp.time; + return (val + tp.millitm); +#else // no gettimeofday() nor ftime() + // If your platform/compiler does not support ms resolution please + // do NOT just shut off these warnings, drop me a line instead at + // + + #if defined(__VISUALC__) || defined (__WATCOMC__) + #pragma message("wxStopWatch will be up to second resolution!") + #elif defined(__BORLANDC__) + #pragma message "wxStopWatch will be up to second resolution!" + #else + #warning "wxStopWatch will be up to second resolution!" + #endif // compiler + + val *= wxGetUTCTime(); + return val; +#endif // time functions +} + +wxLongLong wxGetLocalTimeMillis() +{ + return wxGetUTCTimeMillis() - wxGetTimeZone()*MILLISECONDS_PER_SECOND; +} + +#else // !wxUSE_LONGLONG + +double wxGetLocalTimeMillis(void) +{ + return (double(clock()) / double(CLOCKS_PER_SEC)) * 1000.0; +} + +#endif // wxUSE_LONGLONG/!wxUSE_LONGLONG -- 2.45.2