aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/completion.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/completion.h')
-rw-r--r--include/linux/completion.h46
1 files changed, 2 insertions, 44 deletions
diff --git a/include/linux/completion.h b/include/linux/completion.h
index 57faa60de9bd..02ef8835999c 100644
--- a/include/linux/completion.h
+++ b/include/linux/completion.h
@@ -49,6 +49,8 @@ extern unsigned long wait_for_completion_timeout(struct completion *x,
49 unsigned long timeout); 49 unsigned long timeout);
50extern unsigned long wait_for_completion_interruptible_timeout( 50extern unsigned long wait_for_completion_interruptible_timeout(
51 struct completion *x, unsigned long timeout); 51 struct completion *x, unsigned long timeout);
52extern bool try_wait_for_completion(struct completion *x);
53extern bool completion_done(struct completion *x);
52 54
53extern void complete(struct completion *); 55extern void complete(struct completion *);
54extern void complete_all(struct completion *); 56extern void complete_all(struct completion *);
@@ -56,48 +58,4 @@ extern void complete_all(struct completion *);
56#define INIT_COMPLETION(x) ((x).done = 0) 58#define INIT_COMPLETION(x) ((x).done = 0)
57 59
58 60
59/**
60 * try_wait_for_completion - try to decrement a completion without blocking
61 * @x: completion structure
62 *
63 * Returns: 0 if a decrement cannot be done without blocking
64 * 1 if a decrement succeeded.
65 *
66 * If a completion is being used as a counting completion,
67 * attempt to decrement the counter without blocking. This
68 * enables us to avoid waiting if the resource the completion
69 * is protecting is not available.
70 */
71static inline bool try_wait_for_completion(struct completion *x)
72{
73 int ret = 1;
74
75 spin_lock_irq(&x->wait.lock);
76 if (!x->done)
77 ret = 0;
78 else
79 x->done--;
80 spin_unlock_irq(&x->wait.lock);
81 return ret;
82}
83
84/**
85 * completion_done - Test to see if a completion has any waiters
86 * @x: completion structure
87 *
88 * Returns: 0 if there are waiters (wait_for_completion() in progress)
89 * 1 if there are no waiters.
90 *
91 */
92static inline bool completion_done(struct completion *x)
93{
94 int ret = 1;
95
96 spin_lock_irq(&x->wait.lock);
97 if (!x->done)
98 ret = 0;
99 spin_unlock_irq(&x->wait.lock);
100 return ret;
101}
102
103#endif 61#endif