fix microtime()
This commit is contained in:
parent
a76500b70d
commit
33b63f3efa
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: clock.c,v 1.15 2001/04/23 11:20:41 uch Exp $ */
|
/* $NetBSD: clock.c,v 1.16 2001/06/24 05:00:28 msaitoh Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1993, 1994 Charles Hannum.
|
* Copyright (c) 1993, 1994 Charles Hannum.
|
||||||
@ -142,9 +142,39 @@ microtime(tvp)
|
|||||||
{
|
{
|
||||||
int s = splclock();
|
int s = splclock();
|
||||||
static struct timeval lasttime;
|
static struct timeval lasttime;
|
||||||
|
static u_long numerator = 0;
|
||||||
|
static u_long denominator = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 1/hz resolution ``time'' which is counted up at hardclock().
|
||||||
|
*/
|
||||||
*tvp = time;
|
*tvp = time;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* diff = (PCLOCK/16/hz - 1 - SHREG_TCNT1) / (PCLOCK/16/hz - 1)
|
||||||
|
* * 1/hz * 10^6. [usec]
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (denominator == 0) {
|
||||||
|
numerator = 1000000 / hz;
|
||||||
|
denominator = PCLOCK/16/hz - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff = (denominator - SHREG_TCNT1) * numerator / denominator;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* add ``diff'' to ``time''
|
||||||
|
*/
|
||||||
|
tvp->tv_usec += diff;
|
||||||
|
while (tvp->tv_usec >= 1000000) {
|
||||||
|
tvp->tv_usec -= 1000000;
|
||||||
|
tvp->tv_sec++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* microtime() always gains 1usec at least.
|
||||||
|
*/
|
||||||
|
|
||||||
if (tvp->tv_sec == lasttime.tv_sec &&
|
if (tvp->tv_sec == lasttime.tv_sec &&
|
||||||
tvp->tv_usec <= lasttime.tv_usec &&
|
tvp->tv_usec <= lasttime.tv_usec &&
|
||||||
(tvp->tv_usec = lasttime.tv_usec + 1) >= 1000000) {
|
(tvp->tv_usec = lasttime.tv_usec + 1) >= 1000000) {
|
||||||
@ -152,6 +182,7 @@ microtime(tvp)
|
|||||||
tvp->tv_usec -= 1000000;
|
tvp->tv_usec -= 1000000;
|
||||||
}
|
}
|
||||||
lasttime = *tvp;
|
lasttime = *tvp;
|
||||||
|
|
||||||
splx(s);
|
splx(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user