Home | History | Annotate | Download | only in linux

Lines Matching defs:completion

1 /*	$NetBSD: completion.h,v 1.12 2021/12/19 12:35:37 riastradh Exp $	*/
38 * - Some Linux code does `completion->done++' or similar. Convert
39 * that to complete(completion) and suggest the same change upstream,
41 * which case the Linux completion API should be extended with a
43 * completion'.
59 struct completion {
80 * Initialize a new completion object.
83 init_completion(struct completion *completion)
86 mutex_init(&completion->c_lock, MUTEX_DEFAULT, IPL_SCHED);
87 cv_init(&completion->c_cv, "lnxcmplt");
88 completion->c_done = 0;
92 * re-initialize a completion object.
95 reinit_completion(struct completion *completion)
98 completion->c_done = 0;
102 * Destroy a completion object.
105 destroy_completion(struct completion *completion)
107 KASSERT(!cv_has_waiters(&completion->c_cv));
108 cv_destroy(&completion->c_cv);
109 mutex_destroy(&completion->c_lock);
113 * Notify one waiter of completion, but not any future ones.
116 complete(struct completion *completion)
119 mutex_enter(&completion->c_lock);
122 if (completion->c_done >= 0) {
123 KASSERT(completion->c_done < INT_MAX); /* XXX check */
124 completion->c_done++;
125 cv_signal(&completion->c_cv);
127 KASSERT(completion->c_done == -1);
130 mutex_exit(&completion->c_lock);
135 * completion.
138 complete_all(struct completion *completion)
141 mutex_enter(&completion->c_lock);
144 if (completion->c_done >= 0) {
145 completion->c_done = -1;
146 cv_broadcast(&completion->c_cv);
148 KASSERT(completion->c_done == -1);
151 mutex_exit(&completion->c_lock);
160 * For some reason this works on the completion object itself, not on a
163 #define INIT_COMPLETION(COMPLETION) INIT_COMPLETION_blorp(&(COMPLETION))
166 INIT_COMPLETION_blorp(struct completion *completion)
169 mutex_enter(&completion->c_lock);
170 completion->c_done = 0;
172 mutex_exit(&completion->c_lock);
176 _completion_claim(struct completion *completion)
179 KASSERT(mutex_owned(&completion->c_lock));
180 KASSERT(completion->c_done != 0);
181 if (completion->c_done > 0)
182 completion->c_done--;
184 KASSERT(completion->c_done == -1);
192 wait_for_completion_interruptible_timeout(struct completion *completion,
199 mutex_enter(&completion->c_lock);
202 while (completion->c_done == 0) {
207 error = cv_timedwait_sig(&completion->c_cv,
208 &completion->c_lock, MIN(ticks, INT_MAX/2));
217 _completion_claim(completion);
220 out: mutex_exit(&completion->c_lock);
232 wait_for_completion_timeout(struct completion *completion, unsigned long ticks)
238 mutex_enter(&completion->c_lock);
241 while (completion->c_done == 0) {
246 error = cv_timedwait(&completion->c_cv, &completion->c_lock,
256 _completion_claim(completion);
259 out: mutex_exit(&completion->c_lock);
272 wait_for_completion_interruptible(struct completion *completion)
276 mutex_enter(&completion->c_lock);
279 while (completion->c_done == 0) {
280 error = cv_wait_sig(&completion->c_cv, &completion->c_lock);
286 _completion_claim(completion);
289 out: mutex_exit(&completion->c_lock);
306 wait_for_completion_killable(struct completion *completion)
309 return wait_for_completion_interruptible(completion);
313 wait_for_completion(struct completion *completion)
316 mutex_enter(&completion->c_lock);
317 while (completion->c_done == 0)
318 cv_wait(&completion->c_cv, &completion->c_lock);
319 _completion_claim(completion);
320 mutex_exit(&completion->c_lock);
324 * Try to claim a completion immediately. Return true on success, false
328 try_wait_for_completion(struct completion *completion)
332 mutex_enter(&completion->c_lock);
333 if (completion->c_done == 0) {
336 _completion_claim(completion);
339 mutex_exit(&completion->c_lock);