* signal.cc (nanosleep): Improve test for valid values. Round delay up to
resolution. Fix test for negative remainder. Use timeGetTime through gtod. (sleep): Round up return value. Christopher Faylor <cgf@redhat.com> * hires.h (HIRES_DELAY_MAX): Define. (hires_ms::minperiod): Declare static. (hires_ms::resolution): New. (hires_ms::dmsecs): New. (hires_ms::prime): Return UINT. (gtod): Declare. * times.cc (hires_ms::prime): Always calculate minperiod and set it to 1 in case of failure. Return minperiod. (hires_ms::resolution): Define. (hires_ms::~hires_ms): Delete. (hires_ms::usecs): Check minperiod to prime. (gtod) Define as global.
This commit is contained in:
@@ -142,11 +142,13 @@ totimeval (struct timeval *dst, FILETIME *src, int sub, int flag)
|
||||
dst->tv_sec = x / (long long) (1e6);
|
||||
}
|
||||
|
||||
hires_ms gtod;
|
||||
UINT NO_COPY hires_ms::minperiod;
|
||||
|
||||
/* FIXME: Make thread safe */
|
||||
extern "C" int
|
||||
gettimeofday (struct timeval *tv, struct timezone *tz)
|
||||
{
|
||||
static hires_ms gtod;
|
||||
static bool tzflag;
|
||||
LONGLONG now = gtod.usecs (false);
|
||||
if (now == (LONGLONG) -1)
|
||||
@@ -620,37 +622,42 @@ hires_us::usecs (bool justdelta)
|
||||
return justdelta ? now.QuadPart : primed_ft.QuadPart + now.QuadPart;
|
||||
}
|
||||
|
||||
void
|
||||
UINT
|
||||
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
|
||||
if (!minperiod)
|
||||
if (timeGetDevCaps (&tc, sizeof (tc)) != TIMERR_NOERROR)
|
||||
minperiod = 1;
|
||||
else
|
||||
{
|
||||
minperiod = min (max (tc.wPeriodMin, 1), tc.wPeriodMax);
|
||||
timeBeginPeriod (minperiod);
|
||||
}
|
||||
|
||||
if (!inited)
|
||||
{
|
||||
minperiod = min (max (tc.wPeriodMin, 1), tc.wPeriodMax);
|
||||
timeBeginPeriod (minperiod);
|
||||
int priority = GetThreadPriority (GetCurrentThread ());
|
||||
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
|
||||
initime_ms = timeGetTime ();
|
||||
GetSystemTimeAsFileTime (&f);
|
||||
SetThreadPriority (GetCurrentThread (), priority);
|
||||
|
||||
inited = 1;
|
||||
initime_us.HighPart = f.dwHighDateTime;
|
||||
initime_us.LowPart = f.dwLowDateTime;
|
||||
initime_us.QuadPart -= FACTOR;
|
||||
initime_us.QuadPart /= 10;
|
||||
}
|
||||
|
||||
initime_ms = timeGetTime ();
|
||||
GetSystemTimeAsFileTime (&f);
|
||||
SetThreadPriority (GetCurrentThread (), priority);
|
||||
|
||||
inited = 1;
|
||||
initime_us.HighPart = f.dwHighDateTime;
|
||||
initime_us.LowPart = f.dwLowDateTime;
|
||||
initime_us.QuadPart -= FACTOR;
|
||||
initime_us.QuadPart /= 10;
|
||||
return minperiod;
|
||||
}
|
||||
|
||||
LONGLONG
|
||||
hires_ms::usecs (bool justdelta)
|
||||
{
|
||||
if (!inited)
|
||||
if (!minperiod) /* NO_COPY variable */
|
||||
prime ();
|
||||
DWORD now = timeGetTime ();
|
||||
// FIXME: Not sure how this will handle the 49.71 day wrap around
|
||||
|
Reference in New Issue
Block a user