slings 0.1.4

A small async runtime based on io-uring for Rust
Documentation
use std::future::Future;
use std::io;
use std::os::unix::io::RawFd;
use std::pin::Pin;
use std::ptr;
use std::task::{Context, Poll};

use io_uring::cqueue::buffer_select;
use io_uring::squeue::Flags;
use io_uring::{opcode, types};

use crate::driver::buffers::ProvidedBuf;
use crate::driver::Action;

pub(crate) struct Read;

impl Action<Read> {
    pub(crate) fn read(fd: RawFd, len: u32) -> io::Result<Action<Read>> {
        let entry = opcode::Read::new(types::Fd(fd), ptr::null_mut(), len)
            .buf_group(0)
            .build()
            .flags(Flags::BUFFER_SELECT);

        Action::submit(Read, entry)
    }

    pub(crate) fn poll_read(&mut self, cx: &mut Context<'_>) -> Poll<io::Result<ProvidedBuf>> {
        let completion = ready!(Pin::new(&mut *self).poll(cx));
        let n = completion.result?;
        let bid = buffer_select(completion.flags).expect("buffer_select unimplemented");
        let driver = self.driver.inner.borrow();

        let buf = unsafe {
            let mut provided_buf = driver.buffers.select(bid, self.driver.clone());
            provided_buf.set_len(n as usize);
            provided_buf
        };

        Poll::Ready(Ok(buf))
    }
}