File: wingettimeofday.c

package info (click to toggle)
lft 3.93-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,492 kB
  • sloc: ansic: 11,811; sh: 2,990; makefile: 62
file content (102 lines) | stat: -rwxr-xr-x 2,353 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#if defined(WIN32) || defined(_WIN32)

#include "wingettimeofday.h"
#include <sys/timeb.h>

#ifndef __GNUC__
#define EPOCHFILETIME (116444736000000000i64)
#else
#define EPOCHFILETIME (116444736000000000LL)
#endif


int __gettimeofday(struct timeval* tv, void * tz) 
{
    struct _timeb currSysTime;
	_ftime(&currSysTime);
	
	tv->tv_sec = currSysTime.time;
	tv->tv_usec = currSysTime.millitm * 1000;

    return 0;
}

LARGE_INTEGER getFILETIMEoffset()
{
	SYSTEMTIME s;
	FILETIME f;
	LARGE_INTEGER t;

	s.wYear = 1970;
	s.wMonth = 1;
	s.wDay = 1;
	s.wHour = 0;
	s.wMinute = 0;
	s.wSecond = 0;
	s.wMilliseconds = 0;
	SystemTimeToFileTime(&s, &f);
	t.QuadPart = f.dwHighDateTime;
	t.QuadPart <<= 32;
	t.QuadPart |= f.dwLowDateTime;
	return (t);
}

int gettimeofday(struct timeval *tv, void * tz)
{
	LARGE_INTEGER   t;
	FILETIME   f;
	double     microseconds;
	static LARGE_INTEGER offset;
	static LARGE_INTEGER base;
	static double   frequencyToMicroseconds;
	static int    initialized = 0;
	static BOOL    usePerformanceCounter = 0;

	if(!initialized)
	{
		LARGE_INTEGER performanceFrequency;
		initialized = 1;
		usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
		if(usePerformanceCounter)
		{
			LARGE_INTEGER tmpoffs;
			QueryPerformanceCounter(&offset);
			frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;

			tmpoffs = getFILETIMEoffset();
			GetSystemTimeAsFileTime(&f);
			base.QuadPart = f.dwHighDateTime;
			base.QuadPart <<= 32;
			base.QuadPart |= f.dwLowDateTime;
			base.QuadPart -= tmpoffs.QuadPart;
			microseconds = (double)base.QuadPart / 10;
			base.QuadPart = microseconds;
	tv->tv_sec = base.QuadPart / 1000000;
	tv->tv_usec = base.QuadPart % 1000000;
		}
		else
		{
			offset = getFILETIMEoffset();
			frequencyToMicroseconds = 10.;
			base.QuadPart=0i64;
		}
	}
	if(usePerformanceCounter)
		QueryPerformanceCounter(&t);
	else
	{
		GetSystemTimeAsFileTime(&f);
		t.QuadPart = f.dwHighDateTime;
		t.QuadPart <<= 32;
		t.QuadPart |= f.dwLowDateTime;
	}

	t.QuadPart -= offset.QuadPart;
	microseconds = (double)t.QuadPart / frequencyToMicroseconds;
	t.QuadPart = microseconds + base.QuadPart;
	tv->tv_sec = t.QuadPart / 1000000;
	tv->tv_usec = t.QuadPart % 1000000;
	return (0);
}

#endif