* autoload.cc (timeGetDevCaps): Define new autoload function.

(timeGetTime): Ditto.
(timeBeginPeriod): Ditto.
(timeEndPeriod): Ditto.
* hires.h (hires_base): New class.  Renamed from hires.
(hires_us): New class.
(hires_ms): New class.
* strace.cc (strace::microseconds): Use hires_us class.
* times.cc (gettimeofday): Use hires-ms class.
(hires_us::prime): Renamed from hires::prime.
(hires_us::usecs): Renamed from hires:usecs.
(hires_ms::prime): New method.
(hires_ms::usecs): New method.
(hires_ms::~hires_ms): New destructor.
This commit is contained in:
Christopher Faylor 2002-06-07 03:44:33 +00:00
parent b841df7954
commit 9d0efbb3ae
5 changed files with 91 additions and 8 deletions

View File

@ -1,3 +1,20 @@
2002-06-06 Christopher Faylor <cgf@redhat.com>
* autoload.cc (timeGetDevCaps): Define new autoload function.
(timeGetTime): Ditto.
(timeBeginPeriod): Ditto.
(timeEndPeriod): Ditto.
* hires.h (hires_base): New class. Renamed from hires.
(hires_us): New class.
(hires_ms): New class.
* strace.cc (strace::microseconds): Use hires_us class.
* times.cc (gettimeofday): Use hires-ms class.
(hires_us::prime): Renamed from hires::prime.
(hires_us::usecs): Renamed from hires:usecs.
(hires_ms::prime): New method.
(hires_ms::usecs): New method.
(hires_ms::~hires_ms): New destructor.
2002-06-06 Christopher Faylor <cgf@redhat.com>
* autoload.cc (noload): Correctly save argument count register.

View File

@ -504,4 +504,8 @@ LoadDLLfuncEx (waveOutSetVolume, 8, winmm, 1)
LoadDLLfuncEx (waveOutUnprepareHeader, 12, winmm, 1)
LoadDLLfuncEx (waveOutPrepareHeader, 12, winmm, 1)
LoadDLLfuncEx (waveOutWrite, 12, winmm, 1)
LoadDLLfuncEx (timeGetDevCaps, 8, winmm, 1)
LoadDLLfuncEx (timeGetTime, 0, winmm, 1)
LoadDLLfuncEx (timeBeginPeriod, 4, winmm, 1)
LoadDLLfuncEx (timeEndPeriod, 4, winmm, 1)
}

View File

@ -11,14 +11,37 @@ details. */
#ifndef __HIRES_H__
#define __HIRES_H__
class hires
#include <mmsystem.h>
class hires_base
{
protected:
int inited;
virtual void prime () {}
public:
virtual LONGLONG usecs (bool justdelta) {return 0LL;}
virtual ~hires_base () {}
};
class hires_us : hires_base
{
LARGE_INTEGER primed_ft;
LARGE_INTEGER primed_pc;
double freq;
void prime () __attribute__ ((regparm (1)));
void prime ();
public:
LONGLONG usecs (bool justdelta) __attribute__ ((regparm (2)));
LONGLONG usecs (bool justdelta);
};
class hires_ms : hires_base
{
DWORD initime_ms;
LARGE_INTEGER initime_us;
UINT minperiod;
void prime ();
public:
LONGLONG usecs (bool justdelta);
~hires_ms ();
};
#endif /*__HIRES_H__*/

View File

@ -63,7 +63,7 @@ strace::hello()
int
strace::microseconds ()
{
static hires now;
static hires_us now;
return (int) now.usecs (true);
}

View File

@ -143,9 +143,9 @@ totimeval (struct timeval *dst, FILETIME *src, int sub, int flag)
/* FIXME: Make thread safe */
extern "C" int
gettimeofday(struct timeval *tv, struct timezone *tz)
gettimeofday (struct timeval *tv, struct timezone *tz)
{
static hires gtod;
static hires_ms gtod;
static bool tzflag;
LONGLONG now = gtod.usecs (false);
if (now == (LONGLONG) -1)
@ -580,7 +580,7 @@ cygwin_tzset ()
}
void
hires::prime ()
hires_us::prime ()
{
LARGE_INTEGER ifreq;
if (!QueryPerformanceFrequency (&ifreq))
@ -612,7 +612,7 @@ hires::prime ()
}
LONGLONG
hires::usecs (bool justdelta)
hires_us::usecs (bool justdelta)
{
if (!inited)
prime ();
@ -633,3 +633,42 @@ hires::usecs (bool justdelta)
now.QuadPart = (LONGLONG) (freq * (double) (now.QuadPart - primed_pc.QuadPart));
return justdelta ? now.QuadPart : primed_ft.QuadPart + now.QuadPart;
}
void
hires_ms::prime ()
{
TIMECAPS tc;
FILETIME f;
int priority = GetThreadPriority (GetCurrentThread ());
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
if (timeGetDevCaps (&tc, sizeof (tc)) != TIMERR_NOERROR)
minperiod = 0;
else
{
minperiod = min (max(tc.wPeriodMin, 1), tc.wPeriodMax);
timeBeginPeriod (minperiod);
}
initime_ms = timeGetTime ();
GetSystemTimeAsFileTime (&f);
SetThreadPriority (GetCurrentThread (), priority);
initime_us.HighPart = f.dwHighDateTime;
initime_us.LowPart = f.dwLowDateTime;
initime_us.QuadPart /= 10;
}
LONGLONG
hires_ms::usecs (bool justdelta)
{
if (!inited)
prime ();
DWORD now = timeGetTime ();
// FIXME: Not sure how this will handle the 49.71 day wrap around
LONGLONG res = initime_us.QuadPart + ((LONGLONG) (now - initime_ms) * 1000);
return res;
}
hires_ms::~hires_ms ()
{
timeEndPeriod (minperiod);
}