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 {

Reply via email to