Fixed potential bug related to clock skew when different clocks are used
for hi and lo res timing. Still to be solved where ftime or gettimeofday are not available! git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6359 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -238,6 +238,9 @@ wxLongLong wxGetLocalTimeMillis()
|
||||
{
|
||||
wxLongLong val = 1000l;
|
||||
|
||||
// If possible, use a functin which avoids conversions from
|
||||
// broken-up time structures to milliseconds,
|
||||
|
||||
#if defined(HAVE_GETTIMEOFDAY)
|
||||
struct timeval tp;
|
||||
if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 )
|
||||
@@ -245,35 +248,36 @@ wxLongLong wxGetLocalTimeMillis()
|
||||
val *= tp.tv_sec;
|
||||
return (val + (tp.tv_usec / 1000));
|
||||
}
|
||||
#else
|
||||
|
||||
// We use wxGetLocalTime() to get the seconds since
|
||||
// 00:00:00 Jan 1st 1970 and then whatever is available
|
||||
// to get millisecond resolution.
|
||||
// THIS LEADS TO A BUG SINCE REFERENCE TIME ARE DIFFERENT
|
||||
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(__VISAGECPP__)
|
||||
DATETIME dt;
|
||||
::DosGetDateTime(&dt);
|
||||
return (val + dt.hundredths*10);
|
||||
#elif defined(HAVE_FTIME)
|
||||
struct timeb tp;
|
||||
if ( ftime(&tp) == 0 )
|
||||
{
|
||||
val *= tp.time;
|
||||
return (val + tp.millitm);
|
||||
}
|
||||
#elif !defined(__BORLANDC__) && !(defined(__VISUALC__) && defined(__WIN16__))
|
||||
#warning "wxStopWatch will be up to second resolution!"
|
||||
#endif
|
||||
#else
|
||||
// We use wxGetLocalTime() to get the seconds since
|
||||
// 00:00:00 Jan 1st 1970 and then whatever is available
|
||||
// to get millisecond resolution.
|
||||
//
|
||||
// TODO: This might lead to a problem if the clocks use
|
||||
// different sources.
|
||||
|
||||
val *= wxGetLocalTime();
|
||||
|
||||
#if defined (__WIN32__)
|
||||
SYSTEMTIME st;
|
||||
::GetLocalTime(&st);
|
||||
val += st.wMilliseconds;
|
||||
#elif defined(__VISAGECPP__)
|
||||
DATETIME dt;
|
||||
::DosGetDateTime(&dt);
|
||||
val += (dt.hundredths*10);
|
||||
#else
|
||||
#warning "wxStopWatch will be up to second resolution!"
|
||||
#endif
|
||||
|
||||
return val;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
Reference in New Issue
Block a user