]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
The gettimeofday() function spandsp provided for Windows apparently falls over
authorSteve Underwood <steveu@coppice.org>
Fri, 10 May 2013 03:54:20 +0000 (11:54 +0800)
committerSteve Underwood <steveu@coppice.org>
Fri, 10 May 2013 03:54:20 +0000 (11:54 +0800)
after 25 hours. I guess not many people are inserting header lines on FAX pages.
Hopefully this update fixes the problem.

libs/spandsp/src/msvc/gettimeofday.c

index c59f19e0b821db78f1ffadc72f36bb81275b1423..66422e10876bb2865dd6b8f4f1de05bb3139d9e5 100644 (file)
@@ -4,11 +4,33 @@
 
 #include "windows.h"
 
+const unsigned long long int DELTA_EPOCH_IN_MICROSECS = 11644473600000000LLU
+
 void gettimeofday(struct timeval *tv, void *tz)
 {
-    long int l = GetTickCount();
-    tv->tv_sec = l / 1000;
-    tv->tv_usec = (l % 1000) * 1000;
-    return;
-} 
+    FILETIME ft;
+    unsigned long long int highResolutionTime;
+    TIME_ZONE_INFORMATION tz_winapi;
+    int result_tz;
+    long long int timezone_time_bias_in_minutes;
+
+    ZeroMemory(&ft, sizeof(ft));
+    ZeroMemory(&tz_winapi, sizeof(tz_winapi));
+
+    GetSystemTimeAsFileTime(&ft);
+    result_tz = GetTimeZoneInformation(&tz_winapi);
+    timezone_time_bias_in_minutes = tz_winapi.Bias + ((result_tz == TIME_ZONE_ID_DAYLIGHT)  ?  tz_winapi.DaylightBias  :  0);
+
+    highResolutionTime = ft.dwHighDateTime;
+    highResolutionTime <<= 32;
+    highResolutionTime |= ft.dwLowDateTime;
+
+    /* Converting file time to unix epoch */
+    /* Convert to microseconds */
+    highResolutionTime /= 10;
+    /* Add timezone bias conververt from minutes to microsecond */
+    highResolutionTime -= timezone_time_bias_in_minutes*60*1000000;
+    highResolutionTime -= DELTA_EPOCH_IN_MICROSECS;
+    tv->tv_sec = (long int) (highResolutionTime/1000000LLU);
+    tv->tv_usec = (highResolutionTime%1000000LLU);
+}