pub fn read_poll_timeout<Op, Cond, T>(
op: Op,
cond: Cond,
sleep_delta: Delta,
timeout_delta: Delta,
) -> Result<T>
Expand description
Polls periodically until a condition is met, an error occurs, or the timeout is reached.
The function repeatedly executes the given operation op
closure and
checks its result using the condition closure cond
.
If cond
returns true
, the function returns successfully with
the result of op
. Otherwise, it waits for a duration specified
by sleep_delta
before executing op
again.
This process continues until either op
returns an error, cond
returns true
, or the timeout specified by timeout_delta
is
reached.
This function can only be used in a nonatomic context.
§Errors
If op
returns an error, then that error is returned directly.
If the timeout specified by timeout_delta
is reached, then
Err(ETIMEDOUT)
is returned.
§Examples
use kernel::io::{Io, poll::read_poll_timeout};
use kernel::time::Delta;
const HW_READY: u16 = 0x01;
fn wait_for_hardware<const SIZE: usize>(io: &Io<SIZE>) -> Result<()> {
match read_poll_timeout(
// The `op` closure reads the value of a specific status register.
|| io.try_read16(0x1000),
// The `cond` closure takes a reference to the value returned by `op`
// and checks whether the hardware is ready.
|val: &u16| *val == HW_READY,
Delta::from_millis(50),
Delta::from_secs(3),
) {
Ok(_) => {
// The hardware is ready. The returned value of the `op` closure
// isn't used.
Ok(())
}
Err(e) => Err(e),
}
}