Commit ced58fc7 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet
Browse files

closures: closure_wait_event()



Like wait_event() - except, because it uses closures and closure
waitlists it doesn't have the restriction on modifying task state inside
the condition check, like wait_event() does.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Acked-by: default avatarColy Li <colyli@suse.de>
parent bd0d22e4
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -374,4 +374,26 @@ static inline void closure_call(struct closure *cl, closure_fn fn,
	continue_at_nobarrier(cl, fn, wq);
}

#define __closure_wait_event(waitlist, _cond)				\
do {									\
	struct closure cl;						\
									\
	closure_init_stack(&cl);					\
									\
	while (1) {							\
		closure_wait(waitlist, &cl);				\
		if (_cond)						\
			break;						\
		closure_sync(&cl);					\
	}								\
	closure_wake_up(waitlist);					\
	closure_sync(&cl);						\
} while (0)

#define closure_wait_event(waitlist, _cond)				\
do {									\
	if (!(_cond))							\
		__closure_wait_event(waitlist, _cond);			\
} while (0)

#endif /* _LINUX_CLOSURE_H */