dope-core 0.37.0

Owned native I/O and completion driver for dope
use dope_sys::{
    engine::{Complete, ring::Backend as _},
    io::reactor::complete::resolve::Reclaimed,
    probe::Stopped,
};

mod cqe;
use cqe::Envelope;

use crate::{
    Engine, Events,
    driver::{
        life::native::resolver::Resolver, receive::tokens, result::poll::fault, retained::flight,
    },
    io,
};

type Rejected<'d> = Stopped<Option<tokens::Token<'d, <Engine as Complete>::Pending>>, fault::Fault>;

pub(crate) fn resolve<'d, S>(
    root: &mut Resolver<'_, 'd, S>,
    entry: tokens::Entry<'d>,
) -> Result<Option<io::Event<'d>>, Rejected<'d>> {
    let local = &mut root.local;
    let drain = flight::Drain::new(local.flights, local.driver);
    Envelope::resolve(local.backend.tuning(), &drain, entry.decode::<Events, _>())
        .map_err(Rejected::from)
}

pub(crate) fn reclaim<'d, S>(
    root: &mut Resolver<'_, 'd, S>,
    entry: tokens::Entry<'d>,
) -> Result<(), Rejected<'d>> {
    let local = &mut root.local;
    let drain = flight::Drain::new(local.flights, local.driver);
    let Reclaimed {
        buffer,
        report,
        result,
    } = Envelope::reclaim(
        local.backend.tuning(),
        &drain,
        entry.decode::<Events, _>(),
        local.lifecycle.source.is_some(),
    )?;
    if let Some(buffer) = buffer {
        buffer.release(local);
    }
    if let Some(report) = report {
        local.lifecycle.report(report);
    }
    result.map_err(Rejected::from)
}