61 lines
1.5 KiB
Rust

#![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
}};
);