Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys Split sys_getitimer and sys_setitimer to make it possibl...
details: https://anonhg.NetBSD.org/src/rev/0c81154f0a20
branches: trunk
changeset: 582924:0c81154f0a20
user: cube <cube%NetBSD.org@localhost>
date: Mon Jul 11 19:50:42 2005 +0000
description:
Split sys_getitimer and sys_setitimer to make it possible to share the
relevant code with the COMPAT_NETBSD32 version, and make the latter use
the new functions.
This fixes netbsd32_setitimer() which had drifted from the native syscall
and did not work properly anymore.
diffstat:
sys/compat/netbsd32/netbsd32_time.c | 112 +++++------------------------------
sys/kern/kern_time.c | 47 ++++++++++----
sys/sys/time.h | 5 +-
3 files changed, 54 insertions(+), 110 deletions(-)
diffs (282 lines):
diff -r 5303768b4ac2 -r 0c81154f0a20 sys/compat/netbsd32/netbsd32_time.c
--- a/sys/compat/netbsd32/netbsd32_time.c Mon Jul 11 18:31:12 2005 +0000
+++ b/sys/compat/netbsd32/netbsd32_time.c Mon Jul 11 19:50:42 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_time.c,v 1.9 2005/05/31 00:41:09 christos Exp $ */
+/* $NetBSD: netbsd32_time.c,v 1.10 2005/07/11 19:50:42 cube Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_time.c,v 1.9 2005/05/31 00:41:09 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_time.c,v 1.10 2005/07/11 19:50:42 cube Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ntp.h"
@@ -286,81 +286,30 @@
syscallarg(netbsd32_itimervalp_t) oitv;
} */ *uap = v;
struct proc *p = l->l_proc;
- struct netbsd32_itimerval s32it, *itvp;
+ struct netbsd32_itimerval s32it, *itv32;
int which = SCARG(uap, which);
struct netbsd32_getitimer_args getargs;
struct itimerval aitv;
- int s, error;
- struct ptimer *pt;
+ int error;
if ((u_int)which > ITIMER_PROF)
return (EINVAL);
- itvp = (struct netbsd32_itimerval *)NETBSD32PTR64(SCARG(uap, itv));
- if (itvp && (error = copyin(itvp, &s32it, sizeof(s32it))))
- return (error);
- netbsd32_to_itimerval(&s32it, &aitv);
+ itv32 = (struct netbsd32_itimerval *)NETBSD32PTR64(SCARG(uap, itv));
+ if (itv32) {
+ if ((error = copyin(itv32, &s32it, sizeof(s32it))))
+ return (error);
+ netbsd32_to_itimerval(&s32it, &aitv);
+ }
if (SCARG(uap, oitv) != 0) {
SCARG(&getargs, which) = which;
SCARG(&getargs, itv) = SCARG(uap, oitv);
if ((error = netbsd32_getitimer(l, &getargs, retval)) != 0)
return (error);
}
- if (itvp == 0)
- return (0);
- if (itimerfix(&aitv.it_value) || itimerfix(&aitv.it_interval))
- return (EINVAL);
-
-/* XXX there should be a way to share code with kern_time */
-/* XXX just copied some from there */
- /*
- * Don't bother allocating data structures if the process just
- * wants to clear the timer.
- */
- if (!timerisset(&aitv.it_value) &&
- ((p->p_timers == NULL) || (p->p_timers->pts_timers[which] == NULL)))
- return (0);
+ if (itv32 == 0)
+ return 0;
- if (p->p_timers == NULL)
- timers_alloc(p);
- if (p->p_timers->pts_timers[which] == NULL) {
- pt = pool_get(&ptimer_pool, PR_WAITOK);
- callout_init(&pt->pt_ch);
- pt->pt_ev.sigev_notify = SIGEV_SIGNAL;
- pt->pt_overruns = 0;
- pt->pt_proc = p;
- pt->pt_type = which;
- switch (which) {
- case ITIMER_REAL:
- pt->pt_ev.sigev_signo = SIGALRM;
- break;
- case ITIMER_VIRTUAL:
- pt->pt_ev.sigev_signo = SIGVTALRM;
- break;
- case ITIMER_PROF:
- pt->pt_ev.sigev_signo = SIGPROF;
- break;
- }
- } else
- pt = p->p_timers->pts_timers[which];
-
- pt->pt_time = aitv;
- p->p_timers->pts_timers[which] = pt;
- if (which == ITIMER_REAL) {
- s = splclock();
- callout_stop(&pt->pt_ch);
- if (timerisset(&pt->pt_time.it_value)) {
- timeradd(&pt->pt_time.it_value, &time,
- &pt->pt_time.it_value);
- /*
- * Don't need to check hzto() return value, here.
- * callout_reset() does it for us.
- */
- callout_reset(&pt->pt_ch, hzto(&pt->pt_time.it_value),
- realtimerexpire, pt);
- }
- splx(s);
- }
- return (0);
+ return dosetitimer(p, which, &aitv);
}
int
@@ -374,39 +323,14 @@
syscallarg(netbsd32_itimervalp_t) itv;
} */ *uap = v;
struct proc *p = l->l_proc;
- int which = SCARG(uap, which);
struct netbsd32_itimerval s32it;
struct itimerval aitv;
- int s;
-
- if ((u_int)which > ITIMER_PROF)
- return (EINVAL);
+ int error;
-/* XXX same as setitimer */
- if ((p->p_timers == NULL) || (p->p_timers->pts_timers[which] == NULL)) {
- timerclear(&aitv.it_value);
- timerclear(&aitv.it_interval);
- } else {
- s = splclock();
- if (which == ITIMER_REAL) {
- /*
- * Convert from absolute to relative time in
- * .it_value part of real time timer. If time
- * for real time timer has passed return 0,
- * else return difference between current time
- * and time for the timer to go off.
- */
- aitv = p->p_timers->pts_timers[ITIMER_REAL]->pt_time;
- if (timerisset(&aitv.it_value)) {
- if (timercmp(&aitv.it_value, &time, <))
- timerclear(&aitv.it_value);
- else
- timersub(&aitv.it_value, &time, &aitv.it_value);
- }
- } else
- aitv = p->p_timers->pts_timers[which]->pt_time;
- splx(s);
- }
+ error = dogetitimer(p, SCARG(uap, which), &aitv);
+ if (error)
+ return error;
+
netbsd32_from_itimerval(&aitv, &s32it);
return (copyout(&s32it, (caddr_t)NETBSD32PTR64(SCARG(uap, itv)),
sizeof(s32it)));
diff -r 5303768b4ac2 -r 0c81154f0a20 sys/kern/kern_time.c
--- a/sys/kern/kern_time.c Mon Jul 11 18:31:12 2005 +0000
+++ b/sys/kern/kern_time.c Mon Jul 11 19:50:42 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_time.c,v 1.90 2005/06/23 23:15:12 thorpej Exp $ */
+/* $NetBSD: kern_time.c,v 1.91 2005/07/11 19:50:42 cube 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.90 2005/06/23 23:15:12 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.91 2005/07/11 19:50:42 cube Exp $");
#include "fs_nfs.h"
#include "opt_nfs.h"
@@ -936,24 +936,32 @@
} */ *uap = v;
struct proc *p = l->l_proc;
struct itimerval aitv;
- int s, which;
+ int error;
- which = SCARG(uap, which);
+ error = dogetitimer(p, SCARG(uap, which), &aitv);
+ if (error)
+ return error;
+ return (copyout(&aitv, SCARG(uap, itv), sizeof(struct itimerval)));
+}
+
+int
+dogetitimer(struct proc *p, int which, struct itimerval *itvp)
+{
+ int s;
if ((u_int)which > ITIMER_PROF)
return (EINVAL);
if ((p->p_timers == NULL) || (p->p_timers->pts_timers[which] == NULL)){
- timerclear(&aitv.it_value);
- timerclear(&aitv.it_interval);
+ timerclear(&itvp->it_value);
+ timerclear(&itvp->it_interval);
} else {
s = splclock();
- timer_gettime(p->p_timers->pts_timers[which], &aitv);
+ timer_gettime(p->p_timers->pts_timers[which], itvp);
splx(s);
}
- return (copyout(&aitv, SCARG(uap, itv), sizeof(struct itimerval)));
-
+ return 0;
}
/* BSD routine to set/arm an interval timer. */
@@ -969,10 +977,9 @@
struct proc *p = l->l_proc;
int which = SCARG(uap, which);
struct sys_getitimer_args getargs;
+ const struct itimerval *itvp;
struct itimerval aitv;
- const struct itimerval *itvp;
- struct ptimer *pt;
- int s, error;
+ int error;
if ((u_int)which > ITIMER_PROF)
return (EINVAL);
@@ -988,14 +995,24 @@
}
if (itvp == 0)
return (0);
- if (itimerfix(&aitv.it_value) || itimerfix(&aitv.it_interval))
+
+ return dosetitimer(p, which, &aitv);
+}
+
+int
+dosetitimer(struct proc *p, int which, struct itimerval *itvp)
+{
+ struct ptimer *pt;
+ int s;
+
+ if (itimerfix(&itvp->it_value) || itimerfix(&itvp->it_interval))
return (EINVAL);
/*
* Don't bother allocating data structures if the process just
* wants to clear the timer.
*/
- if (!timerisset(&aitv.it_value) &&
+ if (!timerisset(&itvp->it_value) &&
((p->p_timers == NULL) ||(p->p_timers->pts_timers[which] == NULL)))
return (0);
@@ -1026,7 +1043,7 @@
} else
pt = p->p_timers->pts_timers[which];
- pt->pt_time = aitv;
+ pt->pt_time = *itvp;
p->p_timers->pts_timers[which] = pt;
s = splclock();
diff -r 5303768b4ac2 -r 0c81154f0a20 sys/sys/time.h
--- a/sys/sys/time.h Mon Jul 11 18:31:12 2005 +0000
+++ b/sys/sys/time.h Mon Jul 11 19:50:42 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: time.h,v 1.46 2005/03/17 20:51:00 kleink Exp $ */
+/* $NetBSD: time.h,v 1.47 2005/07/11 19:50:42 cube Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@@ -225,6 +225,9 @@
void timers_alloc(struct proc *);
void timers_free(struct proc *, int);
void realtimerexpire(void *);
+
+int dogetitimer(struct proc *, int, struct itimerval *);
+int dosetitimer(struct proc *, int, struct itimerval *);
#else /* !_KERNEL */
#ifndef _STANDALONE
Home |
Main Index |
Thread Index |
Old Index