summaryrefslogtreecommitdiff
path: root/sys/compat/svr4/svr4_misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/svr4/svr4_misc.c')
-rw-r--r--sys/compat/svr4/svr4_misc.c69
1 files changed, 26 insertions, 43 deletions
diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c
index c0109d794888..349487bca870 100644
--- a/sys/compat/svr4/svr4_misc.c
+++ b/sys/compat/svr4/svr4_misc.c
@@ -861,44 +861,30 @@ svr4_sys_times(td, uap)
struct thread *td;
struct svr4_sys_times_args *uap;
{
- int error, *retval = td->td_retval;
- struct tms tms;
- struct timeval t;
- struct rusage *ru;
- struct rusage r;
- struct getrusage_args ga;
-
- caddr_t sg = stackgap_init();
- ru = stackgap_alloc(&sg, sizeof(struct rusage));
-
- ga.who = RUSAGE_SELF;
- ga.rusage = ru;
+ struct timeval tv, utime, stime, cutime, cstime;
+ struct tms tms;
+ struct proc *p;
+ int error;
- error = getrusage(td, &ga);
- if (error)
- return error;
+ p = td->td_proc;
+ PROC_LOCK(p);
+ calcru(p, &utime, &stime);
+ calccru(p, &cutime, &cstime);
+ PROC_UNLOCK(p);
- if ((error = copyin(ru, &r, sizeof r)) != 0)
- return error;
+ tms.tms_utime = timeval_to_clock_t(&utime);
+ tms.tms_stime = timeval_to_clock_t(&stime);
- tms.tms_utime = timeval_to_clock_t(&r.ru_utime);
- tms.tms_stime = timeval_to_clock_t(&r.ru_stime);
+ tms.tms_cutime = timeval_to_clock_t(&cutime);
+ tms.tms_cstime = timeval_to_clock_t(&cstime);
- ga.who = RUSAGE_CHILDREN;
- error = getrusage(td, &ga);
+ error = copyout(&tms, uap->tp, sizeof(tms));
if (error)
- return error;
-
- if ((error = copyin(ru, &r, sizeof r)) != 0)
- return error;
-
- tms.tms_cutime = timeval_to_clock_t(&r.ru_utime);
- tms.tms_cstime = timeval_to_clock_t(&r.ru_stime);
-
- microtime(&t);
- *retval = timeval_to_clock_t(&t);
+ return (error);
- return copyout(&tms, uap->tp, sizeof(tms));
+ microtime(&tv);
+ td->td_retval[0] = (int)timeval_to_clock_t(&tv);
+ return (0);
}
@@ -1149,6 +1135,7 @@ svr4_setinfo(p, st, s)
int st;
svr4_siginfo_t *s;
{
+ struct timeval utime, stime;
svr4_siginfo_t i;
int sig;
@@ -1159,16 +1146,11 @@ svr4_setinfo(p, st, s)
if (p) {
i.si_pid = p->p_pid;
- mtx_lock_spin(&sched_lock);
- if (p->p_state == PRS_ZOMBIE) {
- i.si_stime = p->p_ru->ru_stime.tv_sec;
- i.si_utime = p->p_ru->ru_utime.tv_sec;
- }
- else {
- i.si_stime = p->p_stats->p_ru.ru_stime.tv_sec;
- i.si_utime = p->p_stats->p_ru.ru_utime.tv_sec;
- }
- mtx_unlock_spin(&sched_lock);
+ PROC_LOCK(p);
+ calcru(p, &utime, &stime);
+ PROC_UNLOCK(p);
+ i.si_stime = stime.tv_sec;
+ i.si_utime = utime.tv_sec;
}
if (WIFEXITED(st)) {
@@ -1296,7 +1278,8 @@ loop:
PROC_UNLOCK(q);
sx_xunlock(&proctree_lock);
q->p_xstat = 0;
- ruadd(&p->p_stats->p_cru, q->p_ru);
+ ruadd(&p->p_stats->p_cru, &p->p_crux, q->p_ru,
+ &q->p_rux);
FREE(q->p_ru, M_ZOMBIE);
q->p_ru = NULL;