123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- #![no_std]
- /// Wait for a condition to become true.
- ///
- /// This macro will wait for a condition to become true.
- ///
- /// ## Parameters
- ///
- /// - `$wq`: The wait queue to wait on.
- /// - `$condition`: The condition to wait for. (you can pass a function or a boolean expression)
- /// - `$cmd`: The command to execute while waiting.
- #[macro_export]
- macro_rules! wq_wait_event_interruptible {
- ($wq:expr, $condition: expr, $cmd: expr) => {{
- let mut retval = Ok(());
- if !$condition {
- retval = wait_queue_macros::_wq_wait_event_interruptible!($wq, $condition, $cmd);
- }
- retval
- }};
- }
- #[macro_export]
- #[allow(clippy::crate_in_macro_def)]
- macro_rules! _wq_wait_event_interruptible {
- ($wq:expr, $condition: expr, $cmd: expr) => {{
- wait_queue_macros::__wq_wait_event!($wq, $condition, true, Ok(()), {
- $cmd;
- crate::sched::schedule(SchedMode::SM_NONE)
- })
- }};
- }
- #[macro_export]
- macro_rules! __wq_wait_event(
- ($wq:expr, $condition: expr, $interruptible: expr, $ret: expr, $cmd:expr) => {{
- let mut retval = $ret;
- let mut exec_finish_wait = true;
- loop {
- let x = $wq.prepare_to_wait_event($interruptible);
- if $condition {
- break;
- }
- if $interruptible && !x.is_ok() {
- retval = x;
- exec_finish_wait = false;
- break;
- }
- $cmd;
- }
- if exec_finish_wait {
- $wq.finish_wait();
- }
- retval
- }};
- );
|