Module Name: src Committed By: christos Date: Fri Mar 29 01:08:17 UTC 2013
Modified Files: src/sys/kern: kern_time.c subr_time.c sys_lwp.c sys_mqueue.c syscalls.master uipc_sem.c Log Message: Centralize the computation of struct timespec to the int timo. Make lwp_park take the regular arguments for specifying what kind of timeout we supply like clock_nanosleep(), namely clockid_t and flags. To generate a diff of this commit: cvs rdiff -u -r1.175 -r1.176 src/sys/kern/kern_time.c cvs rdiff -u -r1.9 -r1.10 src/sys/kern/subr_time.c cvs rdiff -u -r1.55 -r1.56 src/sys/kern/sys_lwp.c cvs rdiff -u -r1.34 -r1.35 src/sys/kern/sys_mqueue.c cvs rdiff -u -r1.261 -r1.262 src/sys/kern/syscalls.master cvs rdiff -u -r1.39 -r1.40 src/sys/kern/uipc_sem.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_time.c diff -u src/sys/kern/kern_time.c:1.175 src/sys/kern/kern_time.c:1.176 --- src/sys/kern/kern_time.c:1.175 Mon Oct 1 21:44:28 2012 +++ src/sys/kern/kern_time.c Thu Mar 28 21:08:17 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_time.c,v 1.175 2012/10/02 01:44:28 christos Exp $ */ +/* $NetBSD: kern_time.c,v 1.176 2013/03/29 01:08:17 christos Exp $ */ /*- * Copyright (c) 2000, 2004, 2005, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.175 2012/10/02 01:44:28 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.176 2013/03/29 01:08:17 christos Exp $"); #include <sys/param.h> #include <sys/resourcevar.h> @@ -346,16 +346,11 @@ nanosleep1(struct lwp *l, clockid_t cloc struct timespec rmtstart; int error, timo; - if ((error = clock_gettime1(clock_id, &rmtstart)) != 0) - return ENOTSUP; - - if (flags & TIMER_ABSTIME) - timespecsub(rqt, &rmtstart, rqt); - - if ((error = itimespecfix(rqt)) != 0) - return error; + if ((error = ts2timo(clock_id, flags, rqt, &timo, &rmtstart)) != 0) { + if (error == ETIMEDOUT) + timo = 0; + } - timo = tstohz(rqt); /* * Avoid inadvertently sleeping forever */ Index: src/sys/kern/subr_time.c diff -u src/sys/kern/subr_time.c:1.9 src/sys/kern/subr_time.c:1.10 --- src/sys/kern/subr_time.c:1.9 Sun Dec 18 17:30:25 2011 +++ src/sys/kern/subr_time.c Thu Mar 28 21:08:17 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_time.c,v 1.9 2011/12/18 22:30:25 christos Exp $ */ +/* $NetBSD: subr_time.c,v 1.10 2013/03/29 01:08:17 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_time.c,v 1.9 2011/12/18 22:30:25 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_time.c,v 1.10 2013/03/29 01:08:17 christos Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -216,21 +216,31 @@ gettimeleft(struct timespec *ts, struct * Calculate delta and convert from struct timespec to the ticks. */ int -abstimeout2timo(struct timespec *ts, int *timo) +ts2timo(clockid_t clock_id, int flags, struct timespec *ts, + int *timo, struct timespec *start) { - struct timespec tsd; int error; + struct timespec tsd; + + flags &= TIMER_ABSTIME; + + if (start == NULL || flags) + start = &tsd; + + if (start) + if ((error = clock_gettime1(clock_id, start)) != 0) + return error; - getnanotime(&tsd); - timespecsub(ts, &tsd, &tsd); - if (tsd.tv_sec < 0 || (tsd.tv_sec == 0 && tsd.tv_nsec <= 0)) { + if (flags) + timespecsub(ts, start, ts); + + if (ts->tv_sec < 0 || (ts->tv_sec == 0 && ts->tv_nsec <= 0)) return ETIMEDOUT; - } - error = itimespecfix(&tsd); - if (error) { + + if ((error = itimespecfix(ts)) != 0) return error; - } - *timo = tstohz(&tsd); + + *timo = tstohz(ts); KASSERT(*timo != 0); return 0; Index: src/sys/kern/sys_lwp.c diff -u src/sys/kern/sys_lwp.c:1.55 src/sys/kern/sys_lwp.c:1.56 --- src/sys/kern/sys_lwp.c:1.55 Thu Sep 27 16:43:15 2012 +++ src/sys/kern/sys_lwp.c Thu Mar 28 21:08:17 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_lwp.c,v 1.55 2012/09/27 20:43:15 rmind Exp $ */ +/* $NetBSD: sys_lwp.c,v 1.56 2013/03/29 01:08:17 christos Exp $ */ /*- * Copyright (c) 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_lwp.c,v 1.55 2012/09/27 20:43:15 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_lwp.c,v 1.56 2013/03/29 01:08:17 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -532,7 +532,7 @@ lwp_unpark(lwpid_t target, const void *h } int -lwp_park(struct timespec *ts, const void *hint) +lwp_park(clockid_t clock_id, int flags, struct timespec *ts, const void *hint) { sleepq_t *sq; kmutex_t *mp; @@ -540,12 +540,9 @@ lwp_park(struct timespec *ts, const void int timo, error; lwp_t *l; - /* Fix up the given timeout value. */ if (ts != NULL) { - error = abstimeout2timo(ts, &timo); - if (error) { + if ((error = ts2timo(clock_id, flags, ts, &timo, NULL)) != 0) return error; - } KASSERT(timo != 0); } else { timo = 0; @@ -591,10 +588,12 @@ lwp_park(struct timespec *ts, const void * requests that it be unparked. */ int -sys____lwp_park50(struct lwp *l, const struct sys____lwp_park50_args *uap, +sys____lwp_park60(struct lwp *l, const struct sys____lwp_park60_args *uap, register_t *retval) { /* { + syscallarg(clockid_t) clock_id; + syscallarg(int) flags; syscallarg(const struct timespec *) ts; syscallarg(lwpid_t) unpark; syscallarg(const void *) hint; @@ -618,7 +617,8 @@ sys____lwp_park50(struct lwp *l, const s return error; } - return lwp_park(tsp, SCARG(uap, hint)); + return lwp_park(SCARG(uap, clock_id), SCARG(uap, flags), tsp, + SCARG(uap, hint)); } int Index: src/sys/kern/sys_mqueue.c diff -u src/sys/kern/sys_mqueue.c:1.34 src/sys/kern/sys_mqueue.c:1.35 --- src/sys/kern/sys_mqueue.c:1.34 Tue Mar 13 14:40:53 2012 +++ src/sys/kern/sys_mqueue.c Thu Mar 28 21:08:17 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_mqueue.c,v 1.34 2012/03/13 18:40:53 elad Exp $ */ +/* $NetBSD: sys_mqueue.c,v 1.35 2013/03/29 01:08:17 christos Exp $ */ /* * Copyright (c) 2007-2011 Mindaugas Rasiukevicius <rmind at NetBSD org> @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.34 2012/03/13 18:40:53 elad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.35 2013/03/29 01:08:17 christos Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -655,7 +655,8 @@ mq_recv1(mqd_t mqdes, void *msg_ptr, siz goto error; } if (ts) { - error = abstimeout2timo(ts, &t); + error = ts2timo(CLOCK_REALTIME, TIMER_ABSTIME, ts, &t, + NULL); if (error) goto error; } else @@ -835,7 +836,8 @@ mq_send1(mqd_t mqdes, const char *msg_pt goto error; } if (ts) { - error = abstimeout2timo(ts, &t); + error = ts2timo(CLOCK_REALTIME, TIMER_ABSTIME, ts, &t, + NULL); if (error) goto error; } else Index: src/sys/kern/syscalls.master diff -u src/sys/kern/syscalls.master:1.261 src/sys/kern/syscalls.master:1.262 --- src/sys/kern/syscalls.master:1.261 Mon Oct 1 21:44:28 2012 +++ src/sys/kern/syscalls.master Thu Mar 28 21:08:17 2013 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.261 2012/10/02 01:44:28 christos Exp $ + $NetBSD: syscalls.master,v 1.262 2013/03/29 01:08:17 christos Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -834,7 +834,7 @@ 433 STD MODULAR { ssize_t|sys|50|mq_timedreceive(mqd_t mqdes, \ char *msg_ptr, size_t msg_len, unsigned *msg_prio, \ const struct timespec *abs_timeout); } -434 STD { int|sys|50|_lwp_park(const struct timespec *ts, \ +434 COMPAT_60 MODULAR { int|sys||_lwp_park(const struct timespec *ts, \ lwpid_t unpark, const void *hint, \ const void *unparkhint); } 435 STD RUMP { int|sys|50|kevent(int fd, \ @@ -941,3 +941,6 @@ 477 STD { int|sys||clock_nanosleep(clockid_t clock_id, \ int flags, const struct timespec *rqtp, \ struct timespec *rmtp); } +478 STD { int|sys|60|_lwp_park(clockid_t clock_id, int flags, \ + const struct timespec *ts, lwpid_t unpark, \ + const void *hint, const void *unparkhint); } Index: src/sys/kern/uipc_sem.c diff -u src/sys/kern/uipc_sem.c:1.39 src/sys/kern/uipc_sem.c:1.40 --- src/sys/kern/uipc_sem.c:1.39 Sat Nov 24 20:05:04 2012 +++ src/sys/kern/uipc_sem.c Thu Mar 28 21:08:17 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_sem.c,v 1.39 2012/11/25 01:05:04 christos Exp $ */ +/* $NetBSD: uipc_sem.c,v 1.40 2013/03/29 01:08:17 christos Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.39 2012/11/25 01:05:04 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.40 2013/03/29 01:08:17 christos Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -686,7 +686,8 @@ do_ksem_wait(lwp_t *l, intptr_t id, bool while (ks->ks_value == 0) { ks->ks_waiters++; if (!try && abstime != NULL) { - error = abstimeout2timo(abstime, &timeo); + error = ts2timo(CLOCK_REALTIME, TIMER_ABSTIME, abstime, + &timeo, NULL); if (error != 0) goto out; } else {