* hires.h: New file.

* times.cc (gettimeofday): Use hires class for calculating current time.
(hires::prime): New method.
(hires::utime): Ditto.
This commit is contained in:
Christopher Faylor 2002-02-15 07:05:05 +00:00
parent d33ab69988
commit dce87b21e1
3 changed files with 96 additions and 23 deletions

View File

@ -1,3 +1,10 @@
2002-02-15 Christopher Faylor <cgf@redhat.com>
* hires.h: New file.
* times.cc (gettimeofday): Use hires class for calculating current time.
(hires::prime): New method.
(hires::utime): Ditto.
2002-02-14 Christopher Faylor <cgf@redhat.com> 2002-02-14 Christopher Faylor <cgf@redhat.com>
* include/sys/cygwin.h (cygwin_getinfo_types): New CW_STRACE_ACTIVE. * include/sys/cygwin.h (cygwin_getinfo_types): New CW_STRACE_ACTIVE.

24
winsup/cygwin/hires.h Normal file
View File

@ -0,0 +1,24 @@
/* hires.h: Definitions for hires clock calculations
Copyright 2002 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#ifndef __HIRES_H__
#define __HIRES_H__
class hires
{
int inited;
LARGE_INTEGER primed_ft;
LARGE_INTEGER primed_pc;
double freq;
void prime ();
public:
LONGLONG utime ();
};
#endif /*__HIRES_H__*/

View File

@ -24,6 +24,7 @@ details. */
#include "sync.h" #include "sync.h"
#include "sigproc.h" #include "sigproc.h"
#include "pinfo.h" #include "pinfo.h"
#include "hires.h"
#define FACTOR (0x19db1ded53e8000LL) #define FACTOR (0x19db1ded53e8000LL)
#define NSPERSEC 10000000LL #define NSPERSEC 10000000LL
@ -149,34 +150,21 @@ totimeval (struct timeval *dst, FILETIME *src, int sub, int flag)
dst->tv_sec = x / (long long) (1e6); dst->tv_sec = x / (long long) (1e6);
} }
/* gettimeofday: BSD */ /* FIXME: Make thread safe */
extern "C" int extern "C" int
gettimeofday (struct timeval *p, struct timezone *z) gettimeofday(struct timeval *tv, struct timezone *tz)
{ {
int res = 0; static hires gtod;
LONGLONG now = gtod.utime ();
if (now == (LONGLONG) -1)
return -1;
if (p != NULL) tv->tv_sec = now / 1000000;
{ tv->tv_usec = now % 1000000;
FILETIME f; return 0;
GetSystemTimeAsFileTime (&f);
totimeval (p, &f, 0, 1);
}
if (z != NULL)
{
tzset();
z->tz_minuteswest = _timezone / 60;
z->tz_dsttime = _daylight;
}
syscall_printf ("%d = gettimeofday (%x, %x)", res, p, z);
return res;
} }
extern "C" extern "C" int
int
_gettimeofday (struct timeval *p, struct timezone *z) _gettimeofday (struct timeval *p, struct timezone *z)
{ {
return gettimeofday (p, z); return gettimeofday (p, z);
@ -569,3 +557,57 @@ void
cygwin_tzset () cygwin_tzset ()
{ {
} }
void
hires::prime ()
{
LARGE_INTEGER ifreq;
if (!QueryPerformanceFrequency (&ifreq))
{
inited = -1;
return;
}
FILETIME f;
int priority = GetThreadPriority (GetCurrentThread ());
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
if (!QueryPerformanceCounter (&primed_pc))
{
inited = -1;
return;
}
GetSystemTimeAsFileTime (&f);
SetThreadPriority (GetCurrentThread (), priority);
inited = 1;
primed_ft.HighPart = f.dwHighDateTime;
primed_ft.LowPart = f.dwLowDateTime;
primed_ft.QuadPart -= FACTOR;
primed_ft.QuadPart /= 10;
freq = (double) ((double) 1000000. / (double) ifreq.QuadPart);
return;
}
LONGLONG
hires::utime ()
{
if (!inited)
prime ();
if (inited < 0)
{
set_errno (ENOSYS);
return (long long) -1;
}
LARGE_INTEGER now;
if (!QueryPerformanceCounter (&now))
{
set_errno (ENOSYS);
return -1;
}
now.QuadPart -= primed_pc.QuadPart;
// FIXME: Use round() here?
return primed_ft.QuadPart + (LONGLONG) ((double) now.QuadPart * freq);
}