diff options
author | davidxu <davidxu@FreeBSD.org> | 2005-12-01 07:56:15 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2005-12-01 07:56:15 +0000 |
commit | 739ca77c48101f3cdf43e5b28e8b99ebf7064158 (patch) | |
tree | 839bf72d3cc53df0a39c5dbe050fd64f72734347 /sys/kern | |
parent | 20a32450f595e2d9e3c978c9c829df07e74bae08 (diff) | |
download | FreeBSD-src-739ca77c48101f3cdf43e5b28e8b99ebf7064158.zip FreeBSD-src-739ca77c48101f3cdf43e5b28e8b99ebf7064158.tar.gz |
1. Set timer configuration values for sysconf().
2. Set overrun limit to INT_MAX, report ERANGE error if overrun will be
greater than INT_MAX.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_time.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index e2be603..4cba08f 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$"); #include <sys/kernel.h> #include <sys/mac.h> #include <sys/syscallsubr.h> +#include <sys/sysctl.h> #include <sys/sysent.h> #include <sys/proc.h> #include <sys/time.h> @@ -51,6 +52,8 @@ __FBSDID("$FreeBSD$"); #include <sys/timetc.h> #include <sys/vnode.h> +#include <posix4/posix4.h> + #include <vm/vm.h> #include <vm/vm_extern.h> @@ -883,6 +886,9 @@ itimer_start(void) NULL, NULL, itimer_init, itimer_fini, UMA_ALIGN_PTR, 0); register_posix_clock(CLOCK_REALTIME, &rt_clock); register_posix_clock(CLOCK_MONOTONIC, &rt_clock); + p31b_setcfg(CTL_P1003_1B_TIMERS, 200112L); + p31b_setcfg(CTL_P1003_1B_DELAYTIMER_MAX, INT_MAX); + p31b_setcfg(CTL_P1003_1B_TIMER_MAX, TIMER_MAX); } int @@ -1408,7 +1414,10 @@ realtimer_expire(void *arg) timespecadd(&it->it_time.it_value, &it->it_time.it_interval); while (timespeccmp(&cts, &it->it_time.it_value, >=)) { - it->it_overrun++; + if (it->it_overrun < INT_MAX) + it->it_overrun++; + else + it->it_ksi.ksi_errno = ERANGE; timespecadd(&it->it_time.it_value, &it->it_time.it_interval); } @@ -1445,6 +1454,7 @@ itimer_fire(struct itimer *it) it->it_sigev.sigev_notify == SIGEV_THREAD_ID) { PROC_LOCK(p); if (!KSI_ONQ(&it->it_ksi)) { + it->it_ksi.ksi_errno = 0; ret = psignal_event(p, &it->it_sigev, &it->it_ksi); if (__predict_false(ret != 0)) { it->it_overrun++; @@ -1461,7 +1471,10 @@ itimer_fire(struct itimer *it) } } } else { - it->it_overrun++; + if (it->it_overrun < INT_MAX) + it->it_overrun++; + else + it->it_ksi.ksi_errno = ERANGE; } PROC_UNLOCK(p); } |