dope-core 0.29.1

Owned native I/O and completion driver for dope
Documentation
use std::time;

use dope_sys::ring::enter;

use crate::driver::{
    life::native::create::Kernel,
    result,
    result::poll::{Filter, Missing, Operation},
    route::indices,
};

/// Lossless, allocation-free reactor polling failure.
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
pub enum Cause {
    Timeout {
        requested: time::Duration,
    },
    Submit {
        cause: result::Kernel,
    },
    Wait {
        cause: result::Kernel,
    },
    Cancel {
        cause: result::Kernel,
    },
    System {
        operation: Operation,
        fault: crate::Errno,
    },
    Revoke {
        descriptor: usize,
        filter: Filter,
        errno: crate::Errno,
    },
    Backing {
        operation: Operation,
        index: indices::SlotIndex,
        filter: Filter,
    },
    Missing {
        operation: Operation,
        cause: Missing,
    },
}

impl<E, C> From<enter::Poll<E, C>> for Cause
where
    Kernel: From<E> + From<C>,
{
    fn from(error: enter::Poll<E, C>) -> Self {
        match error {
            enter::Poll::Timeout { requested: span } => Self::Timeout { requested: span },
            enter::Poll::Submit(cause) => Self::Submit {
                cause: Kernel::from(cause),
            },
            enter::Poll::Wait(cause) => Self::Wait {
                cause: Kernel::from(cause),
            },
            enter::Poll::Cancel(cause) => Self::Cancel {
                cause: Kernel::from(cause),
            },
        }
    }
}