cd50649255
unloadable wave functions as fatal. * hires.h (hires_ms::timeGetTime_ns): New private method. (hires_ms::dmsecs): Call timeGetTime_ns here. * ntdll.h (struct _KSYSTEM_TIME): Define. (KUSER_SHARED_DATA): Redefine to allow access to InterruptTime. (SharedUserData): Define here. (NtQueryTimerResolution): Declare. (NtSetTimerResolution): Declare. * path.cc (SharedUserData): Move to ntdll.h. * times.cc (hires_ms::timeGetTime_ns): New private method. Use throughout instead of timeGetTime. Document entire functionality of timeGetTime in case we need it. (hires_ms::resolution): Try a call to NtQueryTimerResolution to fetch current period. Fall back to heuristic if that fails. Cast to DWORD in assignments to minperiod. (clock_setres): Align period to possible values per a call to NtQueryTimerResolution. Explain why. Replace calls to timeBeginPeriod and timeEndPeriod with underlying call to NtSetTimerResolution. Use status code from NtSetTimerResolution to compute errno. Convert period to ULONGLONG and store 100ns value to simplify code.
59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
/* hires.h: Definitions for hires clock calculations
|
|
|
|
Copyright 2002, 2003, 2004, 2005, 2009, 2010 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__
|
|
|
|
#include <mmsystem.h>
|
|
|
|
/* Largest delay in ms for sleep and alarm calls.
|
|
Allow actual delay to exceed requested delay by 10 s.
|
|
Express as multiple of 1000 (i.e. seconds) + max resolution
|
|
The tv_sec argument in timeval structures cannot exceed
|
|
HIRES_DELAY_MAX / 1000 - 1, so that adding fractional part
|
|
and rounding won't exceed HIRES_DELAY_MAX */
|
|
#define HIRES_DELAY_MAX ((((UINT_MAX - 10000) / 1000) * 1000) + 10)
|
|
|
|
class hires_base
|
|
{
|
|
protected:
|
|
int inited;
|
|
public:
|
|
void reset() {inited = false;}
|
|
};
|
|
|
|
class hires_ns : public hires_base
|
|
{
|
|
LARGE_INTEGER primed_pc;
|
|
double freq;
|
|
void prime ();
|
|
public:
|
|
LONGLONG nsecs ();
|
|
LONGLONG usecs () {return nsecs () / 1000LL;}
|
|
LONGLONG resolution();
|
|
};
|
|
|
|
class hires_ms : public hires_base
|
|
{
|
|
LONGLONG initime_ns;
|
|
LONGLONG timeGetTime_ns ();
|
|
void prime ();
|
|
public:
|
|
LONGLONG nsecs ();
|
|
LONGLONG usecs () {return nsecs () / 10LL;}
|
|
LONGLONG msecs () {return nsecs () / 10000LL;}
|
|
UINT dmsecs () { return timeGetTime_ns () / 10000LL; }
|
|
UINT resolution ();
|
|
LONGLONG uptime () {return (nsecs () - initime_ns) / 10000LL;}
|
|
};
|
|
|
|
extern hires_ms gtod;
|
|
#endif /*__HIRES_H__*/
|