Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys New timedwaitclock_setup.



details:   https://anonhg.NetBSD.org/src/rev/de07293a9f56
branches:  trunk
changeset: 971786:de07293a9f56
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon May 04 18:23:37 2020 +0000

description:
New timedwaitclock_setup.

C99 initializers would have been nice, but part of the struct is
explicit parameters and part of the struct is implicit state, and
-Wmissing-field-initializers can't discriminate between them
(although for some reason it doesn't always fire!).

Instead, just do:

        struct timedwaitclock T;

        timedwaitclock_setup(&T, timeout, clockid, flags, epsilon);
        while (...) {
                error = timedwaitclock_begin(&T, &timo);
                if (error)
                        ...
                error = waitwhatever(timo);
                timedwaitclock_end(&T);
                ...
        }

diffstat:

 sys/kern/kern_condvar.c |  20 ++++++--------------
 sys/kern/subr_time.c    |  44 ++++++++++++++++++++++++++++++++++++++++++--
 sys/sys/timevar.h       |   4 +++-
 3 files changed, 51 insertions(+), 17 deletions(-)

diffs (151 lines):

diff -r e8ed45f9fe86 -r de07293a9f56 sys/kern/kern_condvar.c
--- a/sys/kern/kern_condvar.c   Mon May 04 18:19:34 2020 +0000
+++ b/sys/kern/kern_condvar.c   Mon May 04 18:23:37 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kern_condvar.c,v 1.50 2020/05/03 17:36:33 thorpej Exp $        */
+/*     $NetBSD: kern_condvar.c,v 1.51 2020/05/04 18:23:37 riastradh Exp $      */
 
 /*-
  * Copyright (c) 2006, 2007, 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.50 2020/05/03 17:36:33 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.51 2020/05/04 18:23:37 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -261,12 +261,7 @@
 cv_timedwaitclock(kcondvar_t *cv, kmutex_t *mtx, struct timespec *timeout,
     clockid_t clockid, int flags, const struct bintime *epsilon)
 {
-       struct timedwaitclock T = {
-               .timeout = timeout,
-               .clockid = clockid,
-               .flags = flags,
-               .epsilon = epsilon,
-       };
+       struct timedwaitclock T;
        int timo;
        int error;
 
@@ -275,6 +270,7 @@
                return 0;
        }
 
+       timedwaitclock_setup(&T, timeout, clockid, flags, epsilon);
        error = timedwaitclock_begin(&T, &timo);
        if (error)
                return error;
@@ -301,18 +297,14 @@
 cv_timedwaitclock_sig(kcondvar_t *cv, kmutex_t *mtx, struct timespec *timeout,
     clockid_t clockid, int flags, const struct bintime *epsilon)
 {
-       struct timedwaitclock T = {
-               .timeout = timeout,
-               .clockid = clockid,
-               .flags = flags,
-               .epsilon = epsilon,
-       };
+       struct timedwaitclock T;
        int timo;
        int error;
 
        if (timeout == NULL)
                return cv_wait_sig(cv, mtx);
 
+       timedwaitclock_setup(&T, timeout, clockid, flags, epsilon);
        error = timedwaitclock_begin(&T, &timo);
        if (error)
                return error;
diff -r e8ed45f9fe86 -r de07293a9f56 sys/kern/subr_time.c
--- a/sys/kern/subr_time.c      Mon May 04 18:19:34 2020 +0000
+++ b/sys/kern/subr_time.c      Mon May 04 18:23:37 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: subr_time.c,v 1.22 2020/05/03 17:36:33 thorpej Exp $   */
+/*     $NetBSD: subr_time.c,v 1.23 2020/05/04 18:23:37 riastradh Exp $ */
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_time.c,v 1.22 2020/05/03 17:36:33 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_time.c,v 1.23 2020/05/04 18:23:37 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -355,6 +355,38 @@
        return 0;
 }
 
+/*
+ * timedwaitclock_setup(T, timeout, clockid, flags, epsilon)
+ *
+ *     Initialize state for a timedwaitclock, to be used subsequently
+ *     with timedwaitclock_begin/end, possibly many times in a row.
+ *
+ *     No cleanup action required at the end; the caller-allocated
+ *     (typically stack-allocated) timedwaitclock just holds
+ *     parameters and a little state for timedwaitclock_begin/end.
+ */
+void
+timedwaitclock_setup(struct timedwaitclock *T, struct timespec *timeout,
+    clockid_t clockid, int flags, const struct bintime *epsilon)
+{
+
+       memset(T, 0, sizeof(*T));
+       T->timeout = timeout;
+       T->clockid = clockid;
+       T->flags = flags;
+       T->epsilon = epsilon;
+       T->starttime = (struct timespec){0,0};
+}
+
+/*
+ * timedwaitclock_begin(T, timo)
+ *
+ *     Decide how many ticks to wait for the timedwaitclock T and
+ *     store it in *timo.  Keep state for timedwaitclock_end.  May
+ *     fail with EINVAL if the specified timeout is invalid, or if the
+ *     specified clock fails.  Fails with ETIMEDOUT if there is no
+ *     time left to wait.
+ */
 int
 timedwaitclock_begin(struct timedwaitclock *T, int *timo)
 {
@@ -406,6 +438,14 @@
        return 0;
 }
 
+/*
+ * timedwaitclock_end(T)
+ *
+ *     If the timedwaitclock T was relative, update the caller's
+ *     original timeout to reflect how much time is left, or zero if
+ *     there is no time left or if the clock has gone bad, so that the
+ *     next timedwaitclock_begin will immediately time out.
+ */
 void
 timedwaitclock_end(struct timedwaitclock *T)
 {
diff -r e8ed45f9fe86 -r de07293a9f56 sys/sys/timevar.h
--- a/sys/sys/timevar.h Mon May 04 18:19:34 2020 +0000
+++ b/sys/sys/timevar.h Mon May 04 18:23:37 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: timevar.h,v 1.42 2020/05/03 17:36:33 thorpej Exp $     */
+/*     $NetBSD: timevar.h,v 1.43 2020/05/04 18:23:37 riastradh Exp $   */
 
 /*
  *  Copyright (c) 2005, 2008, The NetBSD Foundation.
@@ -200,6 +200,8 @@
 void   time_init2(void);
 bool   time_wraps(struct timespec *, struct timespec *);
 
+void   timedwaitclock_setup(struct timedwaitclock *, struct timespec *,
+           clockid_t, int, const struct bintime *);
 int    timedwaitclock_begin(struct timedwaitclock *, int *);
 void   timedwaitclock_end(struct timedwaitclock *);
 



Home | Main Index | Thread Index | Old Index