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: Kent Overstreet <kent.overstreet@gmail.com> Acked-by: Coly Li <colyli@suse.de>
This commit is contained in:
parent
bd0d22e41e
commit
ced58fc7ab
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue