]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixed potential bug related to clock skew when different clocks are used
authorGuillermo Rodriguez Garcia <guille@iies.es>
Tue, 29 Feb 2000 20:57:58 +0000 (20:57 +0000)
committerGuillermo Rodriguez Garcia <guille@iies.es>
Tue, 29 Feb 2000 20:57:58 +0000 (20:57 +0000)
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

src/common/timercmn.cpp

index 5c9fe9bd396f14d2ffdebb8bda0347eb04f094f0..3ee44f17578b10d8a43f3ef93ca50674c945b249 100644 (file)
@@ -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)
     struct timeval tp;
     if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 )
 #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));
     }
         val *= tp.tv_sec;
         return (val + (tp.tv_usec / 1000));
     }
+#elif defined(HAVE_FTIME)
+    struct timeb tp;
+    if ( ftime(&tp) == 0 )
+    {
+        val *= tp.time;
+        return (val + tp.millitm);
+    }
 #else
 #else
-
     // We use wxGetLocalTime() to get the seconds since
     // 00:00:00 Jan 1st 1970 and then whatever is available
     // to get millisecond resolution.
     // 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
+    //
+    // TODO: This might lead to a problem if the clocks use
+    //       different sources.
+
     val *= wxGetLocalTime();
 
     val *= wxGetLocalTime();
 
-    // If we got here, do not fail even if we can't get
-    // millisecond resolution.
-    //
-#if defined(__WIN32__)
+#if defined (__WIN32__)
     SYSTEMTIME st;
     ::GetLocalTime(&st);
     SYSTEMTIME st;
     ::GetLocalTime(&st);
-    return (val + st.wMilliseconds);
+    val += st.wMilliseconds;
 #elif defined(__VISAGECPP__)
 #elif defined(__VISAGECPP__)
-    DATETIME    dt;
+    DATETIME dt;
     ::DosGetDateTime(&dt);
     ::DosGetDateTime(&dt);
-    return (val + dt.hundredths*10);
-#elif defined(HAVE_FTIME)
-    struct timeb tp;
-    if ( ftime(&tp) == 0 )
-    {
-        return (val + tp.millitm);
-    }
-#elif !defined(__BORLANDC__) && !(defined(__VISUALC__) && defined(__WIN16__))
-    #warning "wxStopWatch will be up to second resolution!"
-#endif
+    val += (dt.hundredths*10);
+#else
+#warning "wxStopWatch will be up to second resolution!"
 #endif
 
     return val;
 #endif
 
     return val;
+
+#endif
 }
 }