X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0470b1e6fe7a49bb87756006ef9fc232e3dbaaf8..4f6aed9c6a21d4bc732579aa564adf4cdb2c9aab:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index e2ac6496ae..64dbb0aac2 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -1,11 +1,16 @@ ///////////////////////////////////////////////////////////////////////////// // Name: common/timercmn.cpp // Purpose: Common timer implementation -// Author: Julian Smart -// Modified by: Vadim Zeitlin on 12.11.99 to get rid of all ifdefs +// Author: +// Original version by Julian Smart +// Vadim Zeitlin got rid of all ifdefs (11.12.99) +// Sylvain Bougnoux added wxStopWatch class +// Guillermo Rodriguez rewrote from scratch (Dic/99) +// Modified by: // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem +// (c) 1999 Guillermo Rodriguez // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -34,30 +39,22 @@ #endif #include "wx/timer.h" +#include "wx/longlong.h" -// I'm told VMS is POSIX, so should have localtime() -#if defined(__WXMSW__) || defined(__VMS__) - // configure might have found it already for us - #ifndef HAVE_LOCALTIME - #define HAVE_LOCALTIME +#if defined(__WIN32__) + #include +#endif - // TODO add test for broken compilers here if needed - #define WX_GMTOFF_IN_TM - #endif +#include +#ifndef __WXMAC__ + #include // for time_t #endif #if defined(HAVE_GETTIMEOFDAY) #include #include -#elif defined(HAVE_LOCALTIME) - #include - #ifndef __WXMAC__ - #include // for time_t - #endif #elif defined(HAVE_FTIME) #include -#else - #error "no function to find the current time on this system" #endif // ---------------------------------------------------------------------------- @@ -79,142 +76,164 @@ // implementation // ============================================================================ +wxLongLong wxGetLocalTimeMillis(); + // ---------------------------------------------------------------------------- // wxStopWatch // ---------------------------------------------------------------------------- void wxStopWatch::Start(long t) { - m_t0 = wxGetCurrentMTime() - t; + m_t0 = wxGetLocalTimeMillis() - t; m_pause = 0; } long wxStopWatch::Time() const { - return m_pause ? m_pause : GetElapsedTime(); + return (m_pause ? m_pause : GetElapsedTime()); +} + +long wxStopWatch::GetElapsedTime() const +{ + return (wxGetLocalTimeMillis() - m_t0).GetLo(); } // ---------------------------------------------------------------------------- // old timer functions superceded by wxStopWatch // ---------------------------------------------------------------------------- -static long wxStartTime = 0; +static wxLongLong wxStartTime = 0l; // starts the global timer void wxStartTimer() { - wxStartTime = wxGetCurrentMTime(); + wxStartTime = wxGetLocalTimeMillis(); } // Returns elapsed time in milliseconds long wxGetElapsedTime(bool resetTimer) { - long oldTime = wxStartTime; - long newTime = wxGetCurrentMTime(); + wxLongLong oldTime = wxStartTime; + wxLongLong newTime = wxGetLocalTimeMillis(); if ( resetTimer ) wxStartTime = newTime; - return newTime - oldTime; + return (newTime - oldTime).GetLo(); } -// Get number of seconds since 00:00:00 GMT, Jan 1st 1970. -long wxGetCurrentTime() -{ - return wxGetCurrentMTime() / 1000; -} - // ---------------------------------------------------------------------------- // the functions to get the current time and timezone info // ---------------------------------------------------------------------------- -// return GMT time in millisecond -long wxGetCurrentMTime() +// Get local time as seconds since 00:00:00, Jan 1st 1970 +long wxGetLocalTime() { -#if defined(HAVE_LOCALTIME) - time_t t0 = time(&t0); - if ( t0 != (time_t)-1 ) - { - struct tm *tp = localtime(&t0); - - if ( tp ) - { - return 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec); - } - } -#elif defined(HAVE_GETTIMEOFDAY) - struct timeval tp; - if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) - { - return (1000*tp.tv_sec + tp.tv_usec / 1000); - } -#elif defined(HAVE_FTIME) - struct timeb tp; - if ( ftime(&tp) == 0 ) - { - return (1000*tp.time + tp.millitm); - } -#else - #error "no function to find the current time on this system" -#endif - - wxLogSysError(_("Failed to get the system time")); - + 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; } -bool wxGetLocalTime(long *timeZone, int *dstObserved) +// Get UTC time as seconds since 00:00:00, Jan 1st 1970 +long wxGetUTCTime() { -#if defined(HAVE_LOCALTIME) && defined(WX_GMTOFF_IN_TM) - time_t t0 = time(&t0); - if ( t0 != (time_t)-1 ) + struct tm tm, *ptm; + 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 in localtime + + if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) { - struct tm *tm = localtime(&t0); + // To get t0 as GMT we convert to a struct tm with gmtime, + // and then back again. + // + ptm = gmtime(&t0); - if ( tm ) + if (ptm) { - *timeZone = tm->tm_gmtoff; - *dstObserved = tm->tm_isdst; + memcpy(&tm, ptm, sizeof(tm)); + t0 = mktime(&tm); - return TRUE; + if (t0 != (time_t)-1 ) + return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); + wxLogSysError(_("Failed 2nd mktime")); } + wxLogSysError(_("Failed gmtime")); } -#elif defined(HAVE_GETTIMEOFDAY) && !defined(WX_GETTIMEOFDAY_NO_TZ) + wxLogSysError(_("Failed to get the UTC system time")); + return -1; +} + + +// Get local time as milliseconds since 00:00:00, Jan 1st 1970 +wxLongLong wxGetLocalTimeMillis() +{ + // We use wxGetLocalTime() to get the seconds since + // 00:00:00 Jan 1st 1970 and then whatever is available + // to get millisecond resolution. + // + wxLongLong val = 1000l; + val *= wxGetLocalTime(); + + // If we got here, do not fail even if we can't get + // millisecond resolution. + // +#if defined(__WIN32__) + SYSTEMTIME st; + ::GetLocalTime(&st); + return (val + st.wMilliseconds); +#elif defined(HAVE_GETTIMEOFDAY) struct timeval tp; - struct timezone tz; - if ( gettimeofday(&tp, &tz) != -1 ) + if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) { - *timeZone = 60*tz.tz_minuteswest; - *dstObserved = tz.tz_dsttime; - - return TRUE; + return (val + (tp.tv_usec / 1000)); } #elif defined(HAVE_FTIME) - struct timeb tb; - if ( ftime(&tb) == 0 ) + struct timeb tp; + if ( ftime(&tp) == 0 ) { - *timeZone = 60*tb.timezone; - *dstObserved = tb.dstflag; + return (val + tp.millitm); } -#else - // special hacks for known compilers - I wonder if this is still needed, - // i.e. if there are any of them which don't support localtime()? (VZ) - - #if defined(__BORLANDC__) - *timeZone = _timezone; - *dstObserved = _daylight; - #elif defined(__SALFORDC__) - *timeZone = _timezone; - *dstObserved = daylight; - #elif defined(__VISAGECPP__) - *timeZone = _timezone; - *dstObserved = daylight; - #else - wxFAIL_MSG(_T("wxGetLocalTime() not implemented")); - #endif // compiler #endif - return FALSE; + return val; }