diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2013-07-20 13:39:41 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2013-07-20 13:39:41 +0000 |
commit | d31e4b3a5875901c606b5b95829a425e8b3fb645 (patch) | |
tree | d12367b3f2f85d553f4b7f85302bd00bec301df0 /sys/kern/kern_time.c | |
parent | 88a95b1f25b60b94acb513c9186cb5c9262a170e (diff) | |
download | src-d31e4b3a5875901c606b5b95829a425e8b3fb645.tar.gz src-d31e4b3a5875901c606b5b95829a425e8b3fb645.zip |
id_t is 64bit, provide the compat32 wrapper for clock_getcpuclockid2(2).
Reported and tested by: Petr Salinger <Petr.Salinger@seznam.cz>
PR: threads/180652
Sponsored by: The FreeBSD Foundation
Notes
Notes:
svn path=/head/; revision=253494
Diffstat (limited to 'sys/kern/kern_time.c')
-rw-r--r-- | sys/kern/kern_time.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index 9e0cc0687785..6b908a095d47 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -183,38 +183,46 @@ int sys_clock_getcpuclockid2(struct thread *td, struct clock_getcpuclockid2_args *uap) { clockid_t clk_id; + int error; + + error = kern_clock_getcpuclockid2(td, uap->id, uap->which, &clk_id); + if (error == 0) + error = copyout(&clk_id, uap->clock_id, sizeof(clockid_t)); + return (error); +} + +int +kern_clock_getcpuclockid2(struct thread *td, id_t id, int which, + clockid_t *clk_id) +{ struct proc *p; pid_t pid; lwpid_t tid; int error; - switch(uap->which) { + switch (which) { case CPUCLOCK_WHICH_PID: - if (uap->id != 0) { - p = pfind(uap->id); + if (id != 0) { + p = pfind(id); if (p == NULL) return (ESRCH); error = p_cansee(td, p); PROC_UNLOCK(p); - if (error) + if (error != 0) return (error); - pid = uap->id; + pid = id; } else { pid = td->td_proc->p_pid; } - clk_id = MAKE_PROCESS_CPUCLOCK(pid); - break; + *clk_id = MAKE_PROCESS_CPUCLOCK(pid); + return (0); case CPUCLOCK_WHICH_TID: - if (uap->id == 0) - tid = td->td_tid; - else - tid = uap->id; - clk_id = MAKE_THREAD_CPUCLOCK(tid); - break; + tid = id == 0 ? td->td_tid : id; + *clk_id = MAKE_THREAD_CPUCLOCK(tid); + return (0); default: return (EINVAL); } - return (copyout(&clk_id, uap->clock_id, sizeof(clockid_t))); } #ifndef _SYS_SYSPROTO_H_ |