-#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) // || defined(__AIXV3__)
- struct timeval tp;
-#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
- gettimeofday(&tp, (struct timezone *)NULL);
+ 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 )
+ {
+ 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
+ // We use wxGetLocalTime() to get the seconds since
+ // 00:00:00 Jan 1st 1970 and then whatever is available
+ // to get millisecond resolution.
+ //
+ // NOTE that this might lead to a problem if the clocks
+ // use different sources, so this approach should be
+ // avoided where possible.
+
+ val *= wxGetLocalTime();
+
+#if defined(__VISAGECPP__)
+ DATETIME dt;
+ ::DosGetDateTime(&dt);
+ val += (dt.hundredths*10);
+#elif defined (__WIN32__)
+#warning "Possible clock skew bug in wxStopWatch!"
+ SYSTEMTIME st;
+ ::GetLocalTime(&st);
+ val += st.wMilliseconds;