Shuffle routines which just roll values around from kern_clock.c
and kern_time.c to subr_time.c.
This commit is contained in:
parent
70cc392f1e
commit
5fbd525b19
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: files,v 1.857 2007/08/04 11:02:59 ad Exp $
|
||||
# $NetBSD: files,v 1.858 2007/08/09 07:36:19 pooka Exp $
|
||||
|
||||
# @(#)files.newconf 7.5 (Berkeley) 5/10/93
|
||||
|
||||
|
@ -1379,6 +1379,7 @@ file kern/subr_once.c
|
|||
file kern/subr_optstr.c
|
||||
file kern/subr_specificdata.c
|
||||
file kern/subr_tftproot.c tftproot
|
||||
file kern/subr_time.c
|
||||
file kern/subr_userconf.c userconf
|
||||
file kern/subr_vmem.c
|
||||
file kern/subr_workqueue.c
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: kern_clock.c,v 1.109 2007/07/09 21:10:51 ad Exp $ */
|
||||
/* $NetBSD: kern_clock.c,v 1.110 2007/08/09 07:36:18 pooka Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2000, 2004, 2006, 2007 The NetBSD Foundation, Inc.
|
||||
|
@ -76,7 +76,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: kern_clock.c,v 1.109 2007/07/09 21:10:51 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: kern_clock.c,v 1.110 2007/08/09 07:36:18 pooka Exp $");
|
||||
|
||||
#include "opt_ntp.h"
|
||||
#include "opt_multiprocessor.h"
|
||||
|
@ -870,163 +870,6 @@ hardclock(struct clockframe *frame)
|
|||
callout_hardclock();
|
||||
}
|
||||
|
||||
#ifdef __HAVE_TIMECOUNTER
|
||||
/*
|
||||
* Compute number of hz until specified time. Used to compute second
|
||||
* argument to callout_reset() from an absolute time.
|
||||
*/
|
||||
int
|
||||
hzto(struct timeval *tvp)
|
||||
{
|
||||
struct timeval now, tv;
|
||||
|
||||
tv = *tvp; /* Don't modify original tvp. */
|
||||
getmicrotime(&now);
|
||||
timersub(&tv, &now, &tv);
|
||||
return tvtohz(&tv);
|
||||
}
|
||||
#endif /* __HAVE_TIMECOUNTER */
|
||||
|
||||
/*
|
||||
* Compute number of ticks in the specified amount of time.
|
||||
*/
|
||||
int
|
||||
tvtohz(struct timeval *tv)
|
||||
{
|
||||
unsigned long ticks;
|
||||
long sec, usec;
|
||||
|
||||
/*
|
||||
* If the number of usecs in the whole seconds part of the time
|
||||
* difference fits in a long, then the total number of usecs will
|
||||
* fit in an unsigned long. Compute the total and convert it to
|
||||
* ticks, rounding up and adding 1 to allow for the current tick
|
||||
* to expire. Rounding also depends on unsigned long arithmetic
|
||||
* to avoid overflow.
|
||||
*
|
||||
* Otherwise, if the number of ticks in the whole seconds part of
|
||||
* the time difference fits in a long, then convert the parts to
|
||||
* ticks separately and add, using similar rounding methods and
|
||||
* overflow avoidance. This method would work in the previous
|
||||
* case, but it is slightly slower and assumes that hz is integral.
|
||||
*
|
||||
* Otherwise, round the time difference down to the maximum
|
||||
* representable value.
|
||||
*
|
||||
* If ints are 32-bit, then the maximum value for any timeout in
|
||||
* 10ms ticks is 248 days.
|
||||
*/
|
||||
sec = tv->tv_sec;
|
||||
usec = tv->tv_usec;
|
||||
|
||||
if (usec < 0) {
|
||||
sec--;
|
||||
usec += 1000000;
|
||||
}
|
||||
|
||||
if (sec < 0 || (sec == 0 && usec <= 0)) {
|
||||
/*
|
||||
* Would expire now or in the past. Return 0 ticks.
|
||||
* This is different from the legacy hzto() interface,
|
||||
* and callers need to check for it.
|
||||
*/
|
||||
ticks = 0;
|
||||
} else if (sec <= (LONG_MAX / 1000000))
|
||||
ticks = (((sec * 1000000) + (unsigned long)usec + (tick - 1))
|
||||
/ tick) + 1;
|
||||
else if (sec <= (LONG_MAX / hz))
|
||||
ticks = (sec * hz) +
|
||||
(((unsigned long)usec + (tick - 1)) / tick) + 1;
|
||||
else
|
||||
ticks = LONG_MAX;
|
||||
|
||||
if (ticks > INT_MAX)
|
||||
ticks = INT_MAX;
|
||||
|
||||
return ((int)ticks);
|
||||
}
|
||||
|
||||
#ifndef __HAVE_TIMECOUNTER
|
||||
/*
|
||||
* Compute number of hz until specified time. Used to compute second
|
||||
* argument to callout_reset() from an absolute time.
|
||||
*/
|
||||
int
|
||||
hzto(struct timeval *tv)
|
||||
{
|
||||
unsigned long ticks;
|
||||
long sec, usec;
|
||||
int s;
|
||||
|
||||
/*
|
||||
* If the number of usecs in the whole seconds part of the time
|
||||
* difference fits in a long, then the total number of usecs will
|
||||
* fit in an unsigned long. Compute the total and convert it to
|
||||
* ticks, rounding up and adding 1 to allow for the current tick
|
||||
* to expire. Rounding also depends on unsigned long arithmetic
|
||||
* to avoid overflow.
|
||||
*
|
||||
* Otherwise, if the number of ticks in the whole seconds part of
|
||||
* the time difference fits in a long, then convert the parts to
|
||||
* ticks separately and add, using similar rounding methods and
|
||||
* overflow avoidance. This method would work in the previous
|
||||
* case, but it is slightly slower and assume that hz is integral.
|
||||
*
|
||||
* Otherwise, round the time difference down to the maximum
|
||||
* representable value.
|
||||
*
|
||||
* If ints are 32-bit, then the maximum value for any timeout in
|
||||
* 10ms ticks is 248 days.
|
||||
*/
|
||||
s = splclock();
|
||||
sec = tv->tv_sec - time.tv_sec;
|
||||
usec = tv->tv_usec - time.tv_usec;
|
||||
splx(s);
|
||||
|
||||
if (usec < 0) {
|
||||
sec--;
|
||||
usec += 1000000;
|
||||
}
|
||||
|
||||
if (sec < 0 || (sec == 0 && usec <= 0)) {
|
||||
/*
|
||||
* Would expire now or in the past. Return 0 ticks.
|
||||
* This is different from the legacy hzto() interface,
|
||||
* and callers need to check for it.
|
||||
*/
|
||||
ticks = 0;
|
||||
} else if (sec <= (LONG_MAX / 1000000))
|
||||
ticks = (((sec * 1000000) + (unsigned long)usec + (tick - 1))
|
||||
/ tick) + 1;
|
||||
else if (sec <= (LONG_MAX / hz))
|
||||
ticks = (sec * hz) +
|
||||
(((unsigned long)usec + (tick - 1)) / tick) + 1;
|
||||
else
|
||||
ticks = LONG_MAX;
|
||||
|
||||
if (ticks > INT_MAX)
|
||||
ticks = INT_MAX;
|
||||
|
||||
return ((int)ticks);
|
||||
}
|
||||
#endif /* !__HAVE_TIMECOUNTER */
|
||||
|
||||
/*
|
||||
* Compute number of ticks in the specified amount of time.
|
||||
*/
|
||||
int
|
||||
tstohz(struct timespec *ts)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
/*
|
||||
* usec has great enough resolution for hz, so convert to a
|
||||
* timeval and use tvtohz() above.
|
||||
*/
|
||||
TIMESPEC_TO_TIMEVAL(&tv, ts);
|
||||
return tvtohz(&tv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Start profiling on a process.
|
||||
*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: kern_time.c,v 1.127 2007/08/07 11:43:35 ad Exp $ */
|
||||
/* $NetBSD: kern_time.c,v 1.128 2007/08/09 07:36:19 pooka Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2000, 2004, 2005 The NetBSD Foundation, Inc.
|
||||
|
@ -68,7 +68,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.127 2007/08/07 11:43:35 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.128 2007/08/09 07:36:19 pooka Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/resourcevar.h>
|
||||
|
@ -1298,34 +1298,6 @@ timers_free(struct proc *p, int which)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that a proposed value to load into the .it_value or
|
||||
* .it_interval part of an interval timer is acceptable, and
|
||||
* fix it to have at least minimal value (i.e. if it is less
|
||||
* than the resolution of the clock, round it up.)
|
||||
*/
|
||||
int
|
||||
itimerfix(struct timeval *tv)
|
||||
{
|
||||
|
||||
if (tv->tv_sec < 0 || tv->tv_usec < 0 || tv->tv_usec >= 1000000)
|
||||
return (EINVAL);
|
||||
if (tv->tv_sec == 0 && tv->tv_usec != 0 && tv->tv_usec < tick)
|
||||
tv->tv_usec = tick;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
itimespecfix(struct timespec *ts)
|
||||
{
|
||||
|
||||
if (ts->tv_sec < 0 || ts->tv_nsec < 0 || ts->tv_nsec >= 1000000000)
|
||||
return (EINVAL);
|
||||
if (ts->tv_sec == 0 && ts->tv_nsec != 0 && ts->tv_nsec < tick * 1000)
|
||||
ts->tv_nsec = tick * 1000;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decrement an interval timer by a specified number
|
||||
* of microseconds, which must be less than a second,
|
||||
|
|
|
@ -0,0 +1,227 @@
|
|||
/* $NetBSD: subr_time.c,v 1.1 2007/08/09 07:36:19 pooka Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1989, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_clock.c 8.5 (Berkeley) 1/21/94
|
||||
* @(#)kern_time.c 8.4 (Berkeley) 5/26/95
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: subr_time.c,v 1.1 2007/08/09 07:36:19 pooka Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/timex.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/timetc.h>
|
||||
|
||||
#ifdef __HAVE_TIMECOUNTER
|
||||
/*
|
||||
* Compute number of hz until specified time. Used to compute second
|
||||
* argument to callout_reset() from an absolute time.
|
||||
*/
|
||||
int
|
||||
hzto(struct timeval *tvp)
|
||||
{
|
||||
struct timeval now, tv;
|
||||
|
||||
tv = *tvp; /* Don't modify original tvp. */
|
||||
getmicrotime(&now);
|
||||
timersub(&tv, &now, &tv);
|
||||
return tvtohz(&tv);
|
||||
}
|
||||
#endif /* __HAVE_TIMECOUNTER */
|
||||
|
||||
/*
|
||||
* Compute number of ticks in the specified amount of time.
|
||||
*/
|
||||
int
|
||||
tvtohz(struct timeval *tv)
|
||||
{
|
||||
unsigned long ticks;
|
||||
long sec, usec;
|
||||
|
||||
/*
|
||||
* If the number of usecs in the whole seconds part of the time
|
||||
* difference fits in a long, then the total number of usecs will
|
||||
* fit in an unsigned long. Compute the total and convert it to
|
||||
* ticks, rounding up and adding 1 to allow for the current tick
|
||||
* to expire. Rounding also depends on unsigned long arithmetic
|
||||
* to avoid overflow.
|
||||
*
|
||||
* Otherwise, if the number of ticks in the whole seconds part of
|
||||
* the time difference fits in a long, then convert the parts to
|
||||
* ticks separately and add, using similar rounding methods and
|
||||
* overflow avoidance. This method would work in the previous
|
||||
* case, but it is slightly slower and assumes that hz is integral.
|
||||
*
|
||||
* Otherwise, round the time difference down to the maximum
|
||||
* representable value.
|
||||
*
|
||||
* If ints are 32-bit, then the maximum value for any timeout in
|
||||
* 10ms ticks is 248 days.
|
||||
*/
|
||||
sec = tv->tv_sec;
|
||||
usec = tv->tv_usec;
|
||||
|
||||
if (usec < 0) {
|
||||
sec--;
|
||||
usec += 1000000;
|
||||
}
|
||||
|
||||
if (sec < 0 || (sec == 0 && usec <= 0)) {
|
||||
/*
|
||||
* Would expire now or in the past. Return 0 ticks.
|
||||
* This is different from the legacy hzto() interface,
|
||||
* and callers need to check for it.
|
||||
*/
|
||||
ticks = 0;
|
||||
} else if (sec <= (LONG_MAX / 1000000))
|
||||
ticks = (((sec * 1000000) + (unsigned long)usec + (tick - 1))
|
||||
/ tick) + 1;
|
||||
else if (sec <= (LONG_MAX / hz))
|
||||
ticks = (sec * hz) +
|
||||
(((unsigned long)usec + (tick - 1)) / tick) + 1;
|
||||
else
|
||||
ticks = LONG_MAX;
|
||||
|
||||
if (ticks > INT_MAX)
|
||||
ticks = INT_MAX;
|
||||
|
||||
return ((int)ticks);
|
||||
}
|
||||
|
||||
#ifndef __HAVE_TIMECOUNTER
|
||||
/*
|
||||
* Compute number of hz until specified time. Used to compute second
|
||||
* argument to callout_reset() from an absolute time.
|
||||
*/
|
||||
int
|
||||
hzto(struct timeval *tv)
|
||||
{
|
||||
unsigned long ticks;
|
||||
long sec, usec;
|
||||
int s;
|
||||
|
||||
/*
|
||||
* If the number of usecs in the whole seconds part of the time
|
||||
* difference fits in a long, then the total number of usecs will
|
||||
* fit in an unsigned long. Compute the total and convert it to
|
||||
* ticks, rounding up and adding 1 to allow for the current tick
|
||||
* to expire. Rounding also depends on unsigned long arithmetic
|
||||
* to avoid overflow.
|
||||
*
|
||||
* Otherwise, if the number of ticks in the whole seconds part of
|
||||
* the time difference fits in a long, then convert the parts to
|
||||
* ticks separately and add, using similar rounding methods and
|
||||
* overflow avoidance. This method would work in the previous
|
||||
* case, but it is slightly slower and assume that hz is integral.
|
||||
*
|
||||
* Otherwise, round the time difference down to the maximum
|
||||
* representable value.
|
||||
*
|
||||
* If ints are 32-bit, then the maximum value for any timeout in
|
||||
* 10ms ticks is 248 days.
|
||||
*/
|
||||
s = splclock();
|
||||
sec = tv->tv_sec - time.tv_sec;
|
||||
usec = tv->tv_usec - time.tv_usec;
|
||||
splx(s);
|
||||
|
||||
if (usec < 0) {
|
||||
sec--;
|
||||
usec += 1000000;
|
||||
}
|
||||
|
||||
if (sec < 0 || (sec == 0 && usec <= 0)) {
|
||||
/*
|
||||
* Would expire now or in the past. Return 0 ticks.
|
||||
* This is different from the legacy hzto() interface,
|
||||
* and callers need to check for it.
|
||||
*/
|
||||
ticks = 0;
|
||||
} else if (sec <= (LONG_MAX / 1000000))
|
||||
ticks = (((sec * 1000000) + (unsigned long)usec + (tick - 1))
|
||||
/ tick) + 1;
|
||||
else if (sec <= (LONG_MAX / hz))
|
||||
ticks = (sec * hz) +
|
||||
(((unsigned long)usec + (tick - 1)) / tick) + 1;
|
||||
else
|
||||
ticks = LONG_MAX;
|
||||
|
||||
if (ticks > INT_MAX)
|
||||
ticks = INT_MAX;
|
||||
|
||||
return ((int)ticks);
|
||||
}
|
||||
#endif /* !__HAVE_TIMECOUNTER */
|
||||
|
||||
/*
|
||||
* Compute number of ticks in the specified amount of time.
|
||||
*/
|
||||
int
|
||||
tstohz(struct timespec *ts)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
/*
|
||||
* usec has great enough resolution for hz, so convert to a
|
||||
* timeval and use tvtohz() above.
|
||||
*/
|
||||
TIMESPEC_TO_TIMEVAL(&tv, ts);
|
||||
return tvtohz(&tv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that a proposed value to load into the .it_value or
|
||||
* .it_interval part of an interval timer is acceptable, and
|
||||
* fix it to have at least minimal value (i.e. if it is less
|
||||
* than the resolution of the clock, round it up.)
|
||||
*/
|
||||
int
|
||||
itimerfix(struct timeval *tv)
|
||||
{
|
||||
|
||||
if (tv->tv_sec < 0 || tv->tv_usec < 0 || tv->tv_usec >= 1000000)
|
||||
return (EINVAL);
|
||||
if (tv->tv_sec == 0 && tv->tv_usec != 0 && tv->tv_usec < tick)
|
||||
tv->tv_usec = tick;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
itimespecfix(struct timespec *ts)
|
||||
{
|
||||
|
||||
if (ts->tv_sec < 0 || ts->tv_nsec < 0 || ts->tv_nsec >= 1000000000)
|
||||
return (EINVAL);
|
||||
if (ts->tv_sec == 0 && ts->tv_nsec != 0 && ts->tv_nsec < tick * 1000)
|
||||
ts->tv_nsec = tick * 1000;
|
||||
return (0);
|
||||
}
|
Loading…
Reference in New Issue