read_poll_timeout_atomic

Function read_poll_timeout_atomic 

Source
pub fn read_poll_timeout_atomic<Op, Cond, T>(
    op: Op,
    cond: Cond,
    delay_delta: Delta,
    retry: usize,
) -> Result<T>
where Op: FnMut() -> Result<T>, Cond: FnMut(&T) -> bool,
Expand description

Polls periodically until a condition is met, an error occurs, or the attempt limit 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 performs a busy wait for a duration specified by delay_delta before executing op again.

This process continues until either op returns an error, cond returns true, or the attempt limit specified by retry is reached.

§Errors

If op returns an error, then that error is returned directly.

If the attempt limit specified by retry is reached, then Err(ETIMEDOUT) is returned.

§Examples

use kernel::io::{poll::read_poll_timeout_atomic, Io};
use kernel::time::Delta;

const HW_READY: u16 = 0x01;

fn wait_for_hardware<const SIZE: usize>(io: &Io<SIZE>) -> Result {
    read_poll_timeout_atomic(
        // 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_micros(50),
        1000,
    )?;
    Ok(())
}