Function read_poll_timeout

Source
pub fn read_poll_timeout<Op, Cond, T>(
    op: Op,
    cond: Cond,
    sleep_delta: Delta,
    timeout_delta: Delta,
) -> 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 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),
    }
}