mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 14:16:47 +00:00
61 lines
1.5 KiB
Rust
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
|
|
}};
|
|
);
|