Source-Changes-HG archive

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

[src/trunk]: src/sys/external/bsd Move <linux/completion.h> from drm2 to exte...



details:   https://anonhg.NetBSD.org/src/rev/ecc70d3b4282
branches:  trunk
changeset: 328359:ecc70d3b4282
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Tue Apr 01 15:12:38 2014 +0000

description:
Move <linux/completion.h> from drm2 to external/bsd/common.

diffstat:

 sys/external/bsd/common/include/linux/completion.h |  266 +++++++++++++++++++++
 sys/external/bsd/drm2/include/linux/completion.h   |  266 ---------------------
 2 files changed, 266 insertions(+), 266 deletions(-)

diffs (truncated from 540 to 300 lines):

diff -r 5be6a9747f32 -r ecc70d3b4282 sys/external/bsd/common/include/linux/completion.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/external/bsd/common/include/linux/completion.h        Tue Apr 01 15:12:38 2014 +0000
@@ -0,0 +1,266 @@
+/*     $NetBSD: completion.h,v 1.1 2014/04/01 15:12:38 riastradh Exp $ */
+
+/*-
+ * Copyright (c) 2013 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Taylor R. Campbell.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LINUX_COMPLETION_H_
+#define _LINUX_COMPLETION_H_
+
+#include <sys/types.h>
+#include <sys/condvar.h>
+#include <sys/mutex.h>
+
+#include <machine/limits.h>
+
+#include <linux/errno.h>
+
+struct completion {
+       kmutex_t        c_lock;
+       kcondvar_t      c_cv;
+
+       /*
+        * c_done is either
+        *
+        *   . -1, meaning it's open season and we're done for good and
+        *     nobody need wait any more;
+        *
+        *   . 0, meaning nothing is done, so waiters must block; or
+        *
+        *   . a positive integer, meaning that many waiters can
+        *     proceed before further waiters must block.
+        *
+        * Negative values other than -1 are not allowed.
+        */
+       int             c_done;
+};
+
+/*
+ * Initialize a new completion object.
+ */
+static inline void
+init_completion(struct completion *completion)
+{
+
+       mutex_init(&completion->c_lock, MUTEX_DEFAULT, IPL_NONE);
+       cv_init(&completion->c_cv, "lnxcmplt");
+       completion->c_done = 0;
+}
+
+/*
+ * Destroy a completion object.
+ */
+static inline void
+destroy_completion(struct completion *completion)
+{
+       KASSERT(!cv_has_waiters(&completion->c_cv));
+       cv_destroy(&completion->c_cv);
+       mutex_destroy(&completion->c_lock);
+}
+
+/*
+ * Notify one waiter of completion, but not any future ones.
+ */
+static inline void
+complete(struct completion *completion)
+{
+
+       mutex_enter(&completion->c_lock);
+
+       /* If it's not open season, wake one waiter.  */
+       if (completion->c_done >= 0) {
+               KASSERT(completion->c_done < INT_MAX); /* XXX check */
+               completion->c_done++;
+               cv_signal(&completion->c_cv);
+       } else {
+               KASSERT(completion->c_done == -1);
+       }
+
+       mutex_exit(&completion->c_lock);
+}
+
+/*
+ * Notify all waiters, present and future (until INIT_COMPLETION), of
+ * completion.
+ */
+static inline void
+complete_all(struct completion *completion)
+{
+
+       mutex_enter(&completion->c_lock);
+
+       /* If it's not open season, make it open season and wake everyone.  */
+       if (completion->c_done >= 0) {
+               completion->c_done = -1;
+               cv_broadcast(&completion->c_cv);
+       } else {
+               KASSERT(completion->c_done == -1);
+       }
+
+       mutex_exit(&completion->c_lock);
+}
+
+/*
+ * Reverse the effect of complete_all so that subsequent waiters block
+ * until someone calls complete or complete_all.
+ *
+ * This operation is very different from its lowercase counterpart.
+ *
+ * For some reason this works on the completion object itself, not on a
+ * pointer thereto, so it must be a macro.
+ */
+#define        INIT_COMPLETION(COMPLETION)     INIT_COMPLETION_blorp(&(COMPLETION))
+
+static inline void
+INIT_COMPLETION_blorp(struct completion *completion)
+{
+
+       mutex_enter(&completion->c_lock);
+       completion->c_done = 0;
+       /* No notify -- waiters are interested only in nonzero values.  */
+       mutex_exit(&completion->c_lock);
+}
+
+static inline void
+_completion_claim(struct completion *completion)
+{
+
+       KASSERT(mutex_owned(&completion->c_lock));
+       if (completion->c_done > 0)
+               completion->c_done--;
+       else
+               KASSERT(completion->c_done == -1);
+}
+
+/*
+ * Wait interruptibly with a timeout for someone to call complete or
+ * complete_all.
+ */
+static inline int
+wait_for_completion_interruptible_timeout(struct completion *completion,
+    unsigned long ticks)
+{
+       /* XXX Arithmetic overflow...?  */
+       unsigned int start = hardclock_ticks, now;
+       int error;
+
+       mutex_enter(&completion->c_lock);
+
+       /* Wait until c_done is nonzero.  */
+       while (completion->c_done == 0) {
+               error = cv_timedwait_sig(&completion->c_cv,
+                   &completion->c_lock, ticks);
+               if (error)
+                       goto out;
+               now = hardclock_ticks;
+               if (ticks < (now - start)) {
+                       error = EWOULDBLOCK;
+                       goto out;
+               }
+               ticks -= (now - start);
+               start = now;
+       }
+
+       /* Success!  */
+       _completion_claim(completion);
+       error = 0;
+
+out:   mutex_exit(&completion->c_lock);
+       if (error == EWOULDBLOCK) {
+               return 0;
+       } else if ((error == EINTR) || (error == ERESTART)) {
+               return -ERESTARTSYS;
+       } else {
+               KASSERTMSG((error == 0), "error = %d", error);
+               return ticks;
+       }
+}
+
+/*
+ * Wait interruptibly for someone to call complete or complete_all.
+ */
+static inline int
+wait_for_completion_interruptible(struct completion *completion)
+{
+       int error;
+
+       mutex_enter(&completion->c_lock);
+
+       /* Wait until c_done is nonzero.  */
+       while (completion->c_done == 0) {
+               error = cv_wait_sig(&completion->c_cv, &completion->c_lock);
+               if (error)
+                       goto out;
+       }
+
+       /* Success!  */
+       _completion_claim(completion);
+       error = 0;
+
+out:   mutex_exit(&completion->c_lock);
+       if ((error == EINTR) || (error == ERESTART))
+               error = -ERESTARTSYS;
+       return error;
+}
+
+/*
+ * Wait uninterruptibly, except by SIGKILL, for someone to call
+ * complete or complete_all.
+ *
+ * XXX In this implementation, any signal will actually wake us, not
+ * just SIGKILL.
+ */
+static inline int
+wait_for_completion_killable(struct completion *completion)
+{
+
+       return wait_for_completion_interruptible(completion);
+}
+
+/*
+ * Try to claim a completion immediately.  Return true on success, false
+ * if it would block.
+ */
+static inline bool
+try_wait_for_completion(struct completion *completion)
+{
+       bool ok;
+
+       mutex_enter(&completion->c_lock);
+       if (completion->c_done == 0) {
+               ok = false;
+       } else {
+               _completion_claim(completion);
+               ok = true;
+       }
+       mutex_exit(&completion->c_lock);
+
+       return ok;
+}
+
+#endif /* _LINUX_COMPLETION_H_ */
diff -r 5be6a9747f32 -r ecc70d3b4282 sys/external/bsd/drm2/include/linux/completion.h
--- a/sys/external/bsd/drm2/include/linux/completion.h  Tue Apr 01 15:10:23 2014 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,266 +0,0 @@
-/*     $NetBSD: completion.h,v 1.3 2014/04/01 14:55:20 riastradh Exp $ */
-
-/*-
- * Copyright (c) 2013 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Taylor R. Campbell.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN



Home | Main Index | Thread Index | Old Index