00001
00002
00003
00004
00005
00006
00007 #include "wvtimeutils.h"
00008 #include <limits.h>
00009 #ifndef _MSC_VER
00010 #include <unistd.h>
00011 #include <utime.h>
00012 #endif
00013
00014 time_t msecdiff(const WvTime &a, const WvTime &b)
00015 {
00016 long long secdiff = a.tv_sec - b.tv_sec;
00017 long long usecdiff = a.tv_usec - b.tv_usec;
00018 long long msecs = secdiff * 1000 + usecdiff / 1000;
00019
00020 time_t rval;
00021 if (msecs > INT_MAX)
00022 rval = INT_MAX;
00023 else if (msecs < INT_MIN)
00024 rval = INT_MIN;
00025 else
00026 rval = msecs;
00027 return rval;
00028 }
00029
00030
00031 WvTime wvtime()
00032 {
00033 struct timeval tv;
00034 gettimeofday(&tv, 0);
00035 return tv;
00036 }
00037
00038
00039 WvTime msecadd(const WvTime &a, time_t msec)
00040 {
00041 WvTime b;
00042 b.tv_sec = a.tv_sec + msec / 1000;
00043 b.tv_usec = a.tv_usec + (msec % 1000) * 1000;
00044 normalize(b);
00045 return b;
00046 }
00047
00048
00049 WvTime tvdiff(const WvTime &a, const WvTime &b)
00050 {
00051 WvTime c;
00052 c.tv_sec = a.tv_sec - b.tv_sec;
00053 c.tv_usec = a.tv_usec;
00054
00055 if (b.tv_usec > a.tv_usec)
00056 {
00057 c.tv_sec--;
00058 c.tv_usec += 1000000;
00059 }
00060
00061 c.tv_usec -= b.tv_usec;
00062
00063 normalize(c);
00064 return c;
00065 }
00066
00067
00068 static WvTime wvstime_cur = wvtime();
00069
00070
00071 const WvTime &wvstime()
00072 {
00073 return wvstime_cur;
00074 }
00075
00076
00077 static void do_wvstime_sync(bool forward_only)
00078 {
00079 if (!forward_only)
00080 {
00081 wvstime_cur = wvtime();
00082 }
00083 else
00084 {
00085 WvTime now = wvtime();
00086 if (wvstime_cur < now)
00087 wvstime_cur = now;
00088 }
00089 }
00090
00091
00092 void wvstime_sync()
00093 {
00094 do_wvstime_sync(false);
00095 }
00096
00097
00098 void wvstime_sync_forward()
00099 {
00100 do_wvstime_sync(true);
00101 }
00102
00103
00104 void wvstime_set(const WvTime &_new_time)
00105 {
00106 wvstime_cur = _new_time;
00107 }
00108
00109
00110 void wvdelay(int msec_delay)
00111 {
00112 #ifdef _WIN32
00113 Sleep(msec_delay);
00114 #else
00115 usleep(msec_delay * 1000);
00116 #endif
00117 }