dope-core 0.11.0

The manifold runtime
Documentation
use std::ptr::NonNull;

use crate::backend::Backend;

pub(crate) trait BufferBackend {
    fn buffer_group(backend: &Backend) -> u16;
    fn buffer_len(backend: &Backend) -> usize;
    unsafe fn release_buffer(backend: &mut Backend, bid: u16);
    unsafe fn buffer_ptr_len(backend: &Backend, len: u32, bid: u16) -> (NonNull<u8>, usize);
}

#[cfg(target_os = "linux")]
mod linux {
    use std::ptr::NonNull;

    use crate::backend::uring::provided::ring::Ring;

    use super::{Backend, BufferBackend};

    impl BufferBackend for Backend {
        fn buffer_group(_backend: &Backend) -> u16 {
            Ring::BGID
        }

        fn buffer_len(backend: &Backend) -> usize {
            backend.provided.buf_len()
        }

        unsafe fn release_buffer(backend: &mut Backend, bid: u16) {
            backend.provided.defer(bid);
        }

        unsafe fn buffer_ptr_len(backend: &Backend, len: u32, bid: u16) -> (NonNull<u8>, usize) {
            let (ptr, len) = backend.provided.ptr_len(bid, len as usize);
            (unsafe { NonNull::new_unchecked(ptr.cast_mut()) }, len)
        }
    }
}

#[cfg(not(target_os = "linux"))]
mod kqueue {
    use std::ptr::NonNull;

    use crate::backend::kqueue::driver::read::dispatch::Dispatch;

    use super::{Backend, BufferBackend};

    impl BufferBackend for Backend {
        fn buffer_group(_backend: &Backend) -> u16 {
            0
        }

        fn buffer_len(backend: &Backend) -> usize {
            backend.provided.buf_len()
        }

        unsafe fn release_buffer(backend: &mut Backend, bid: u16) {
            backend.provided.defer(bid);
            if !backend.resume.is_empty() {
                backend.resume_pending();
            }
        }

        unsafe fn buffer_ptr_len(backend: &Backend, len: u32, bid: u16) -> (NonNull<u8>, usize) {
            unsafe { backend.backing.ptr_len(bid, len as usize) }
        }
    }
}