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;
|
wxLongLong val = 1000l;
|
||||||
|
|
||||||
|
// If possible, use a functin which avoids conversions from
|
||||||
|
// broken-up time structures to milliseconds,
|
||||||
|
|
||||||
#if defined(HAVE_GETTIMEOFDAY)
|
#if defined(HAVE_GETTIMEOFDAY)
|
||||||
struct timeval tp;
|
struct timeval tp;
|
||||||
if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 )
|
if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 )
|
||||||
@@ -245,35 +248,36 @@ wxLongLong wxGetLocalTimeMillis()
|
|||||||
val *= tp.tv_sec;
|
val *= tp.tv_sec;
|
||||||
return (val + (tp.tv_usec / 1000));
|
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)
|
#elif defined(HAVE_FTIME)
|
||||||
struct timeb tp;
|
struct timeb tp;
|
||||||
if ( ftime(&tp) == 0 )
|
if ( ftime(&tp) == 0 )
|
||||||
{
|
{
|
||||||
|
val *= tp.time;
|
||||||
return (val + tp.millitm);
|
return (val + tp.millitm);
|
||||||
}
|
}
|
||||||
#elif !defined(__BORLANDC__) && !(defined(__VISUALC__) && defined(__WIN16__))
|
#else
|
||||||
#warning "wxStopWatch will be up to second resolution!"
|
// We use wxGetLocalTime() to get the seconds since
|
||||||
#endif
|
// 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
|
#endif
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user