diff options
Diffstat (limited to 'sys/compat/svr4/svr4_misc.c')
| -rw-r--r-- | sys/compat/svr4/svr4_misc.c | 69 |
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; |
