* hires.h (hires_ms::dmsecs): Drop unused method.
* times.cc (JITTER): Remove. (gtod): Revert to process-local variable. (hires_ms::nsecs): Just return system time to disallow discrepancy with the OS. (hires_ms::resolution): Return coarsest timer value from OS. Add comment to explain why. (clock_setres): Ditto.
This commit is contained in:
parent
cff00a2038
commit
b54d64de05
@ -1,3 +1,14 @@
|
|||||||
|
2012-03-26 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* hires.h (hires_ms::dmsecs): Drop unused method.
|
||||||
|
* times.cc (JITTER): Remove.
|
||||||
|
(gtod): Revert to process-local variable.
|
||||||
|
(hires_ms::nsecs): Just return system time to disallow discrepancy with
|
||||||
|
the OS.
|
||||||
|
(hires_ms::resolution): Return coarsest timer value from OS. Add
|
||||||
|
comment to explain why.
|
||||||
|
(clock_setres): Ditto.
|
||||||
|
|
||||||
2012-03-21 Christopher Faylor <me.cygwin2012@cgf.cx>
|
2012-03-21 Christopher Faylor <me.cygwin2012@cgf.cx>
|
||||||
|
|
||||||
* child_info.h: Reset magic number.
|
* child_info.h: Reset magic number.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* hires.h: Definitions for hires clock calculations
|
/* hires.h: Definitions for hires clock calculations
|
||||||
|
|
||||||
Copyright 2002, 2003, 2004, 2005, 2009, 2010, 2011 Red Hat, Inc.
|
Copyright 2002, 2003, 2004, 2005, 2009, 2010, 2011, 2012 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
@ -62,7 +62,6 @@ class hires_ms : public hires_base
|
|||||||
LONGLONG nsecs ();
|
LONGLONG nsecs ();
|
||||||
LONGLONG usecs () {return nsecs () / 10LL;}
|
LONGLONG usecs () {return nsecs () / 10LL;}
|
||||||
LONGLONG msecs () {return nsecs () / 10000LL;}
|
LONGLONG msecs () {return nsecs () / 10000LL;}
|
||||||
UINT dmsecs () { return timeGetTime_ns () / 10000LL; }
|
|
||||||
UINT resolution ();
|
UINT resolution ();
|
||||||
LONGLONG uptime () {return (nsecs () - initime_ns) / 10000LL;}
|
LONGLONG uptime () {return (nsecs () - initime_ns) / 10000LL;}
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* times.cc
|
/* times.cc
|
||||||
|
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||||
2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
|
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
@ -27,17 +27,7 @@ details. */
|
|||||||
#include "cygtls.h"
|
#include "cygtls.h"
|
||||||
#include "ntdll.h"
|
#include "ntdll.h"
|
||||||
|
|
||||||
/* Max allowed diversion in 100ns of internal timer from system time. If
|
hires_ms NO_COPY gtod;
|
||||||
this difference is exceeded, the internal timer gets re-primed. */
|
|
||||||
#define JITTER (40 * 10000LL)
|
|
||||||
|
|
||||||
/* TODO: Putting this variable in the shared cygwin region partially solves
|
|
||||||
the problem of cygwin processes not recognizing date changes when other
|
|
||||||
cygwin processes set the date. There is still an additional problem of
|
|
||||||
long-running cygwin processes becoming confused when a non-cygwin process
|
|
||||||
sets the date. Unfortunately, it looks like a minor redesign is required
|
|
||||||
to handle that case. */
|
|
||||||
hires_ms gtod __attribute__((section (".cygwin_dll_common"), shared));
|
|
||||||
|
|
||||||
hires_ns NO_COPY ntod;
|
hires_ns NO_COPY ntod;
|
||||||
|
|
||||||
@ -575,16 +565,7 @@ hires_ms::nsecs ()
|
|||||||
{
|
{
|
||||||
if (!inited)
|
if (!inited)
|
||||||
prime ();
|
prime ();
|
||||||
|
return systime_ns ();
|
||||||
LONGLONG t = systime_ns ();
|
|
||||||
LONGLONG res = initime_ns + timeGetTime_ns ();
|
|
||||||
if (llabs (res - t) > JITTER)
|
|
||||||
{
|
|
||||||
inited = false;
|
|
||||||
prime ();
|
|
||||||
res = initime_ns + timeGetTime_ns ();
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
@ -731,10 +712,15 @@ hires_ms::resolution ()
|
|||||||
|
|
||||||
status = NtQueryTimerResolution (&coarsest, &finest, &actual);
|
status = NtQueryTimerResolution (&coarsest, &finest, &actual);
|
||||||
if (NT_SUCCESS (status))
|
if (NT_SUCCESS (status))
|
||||||
minperiod = (DWORD) actual;
|
/* The actual resolution of the OS timer is a system-wide setting which
|
||||||
|
can be changed any time, by any process. The only fixed value we
|
||||||
|
can rely on is the coarsest value. */
|
||||||
|
minperiod = coarsest;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Try to empirically determine current timer resolution */
|
/* There's no good reason that NtQueryTimerResolution should fail
|
||||||
|
at all, but let's play it safe. Try to empirically determine
|
||||||
|
current timer resolution */
|
||||||
int priority = GetThreadPriority (GetCurrentThread ());
|
int priority = GetThreadPriority (GetCurrentThread ());
|
||||||
SetThreadPriority (GetCurrentThread (),
|
SetThreadPriority (GetCurrentThread (),
|
||||||
THREAD_PRIORITY_TIME_CRITICAL);
|
THREAD_PRIORITY_TIME_CRITICAL);
|
||||||
@ -837,7 +823,10 @@ clock_setres (clockid_t clk_id, struct timespec *tp)
|
|||||||
__seterrno_from_nt_status (status);
|
__seterrno_from_nt_status (status);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
minperiod = actual;
|
/* The actual resolution of the OS timer is a system-wide setting which
|
||||||
|
can be changed any time, by any process. The only fixed value we can
|
||||||
|
rely on is the coarsest value. */
|
||||||
|
minperiod = coarsest;
|
||||||
period_set = true;
|
period_set = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user