dope-core 0.14.0

The manifold runtime
Documentation
use crate::backend::{Backend, RecvBuffer};

pub(crate) trait BufferBackend {
    fn buffer_group(backend: &Backend) -> u16;
    fn buffer_len(backend: &Backend) -> usize;
    fn buffer_count(backend: &Backend) -> usize;
    fn release_buffer(backend: &mut Backend, buffer: RecvBuffer);
}

#[cfg(target_os = "linux")]
mod linux {
    use super::{Backend, BufferBackend, RecvBuffer};
    use crate::backend::uring::provided::ffi::ring::RegisteredRing;

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

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

        fn buffer_count(backend: &Backend) -> usize {
            backend.ring.provided().entries()
        }

        fn release_buffer(backend: &mut Backend, buffer: RecvBuffer) {
            backend.ring.provided_mut().defer(buffer);
        }
    }
}

#[cfg(not(target_os = "linux"))]
mod kqueue {
    use super::{Backend, BufferBackend, RecvBuffer};
    use crate::backend::kqueue::driver::read::dispatch::Dispatch;

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

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

        fn buffer_count(backend: &Backend) -> usize {
            backend.recv.entries()
        }

        fn release_buffer(backend: &mut Backend, buffer: RecvBuffer) {
            backend.recv.defer(buffer);
            if !backend.resume.is_empty() {
                backend.resume_pending();
            }
        }
    }
}