Skip to main content

dope_core/io/socket/msg/
mod.rs

1use std::mem;
2
3pub use builder::Builder;
4use dope_sys::io::{
5    self, socket,
6    socket::msg::{Header, Iovec},
7};
8
9use crate::io::transfer;
10
11mod builder;
12pub mod raw;
13
14/// Maximum number of scatter/gather entries accepted by one socket message.
15pub const MAX_IOVECS: usize = <crate::Backend as socket::Socket>::MAX_IOVECS;
16
17/// A send message retaining at most `N` iovecs and their exact live byte sum.
18pub struct Vectored<'a, const N: usize = MAX_IOVECS> {
19    message: Message<'a>,
20    iovs: &'a [Iovec],
21    bytes: transfer::Len,
22}
23
24impl<'a, const N: usize> Vectored<'a, N> {
25    #[must_use]
26    pub fn message(&self) -> Message<'a> {
27        self.message
28    }
29
30    #[must_use]
31    pub const fn bytes(&self) -> transfer::Len {
32        self.bytes
33    }
34
35    #[must_use]
36    pub fn is_empty(&self) -> bool {
37        self.bytes == transfer::Len::ZERO
38    }
39}
40
41impl<'a, const N: usize> Vectored<'a, N> {
42    fn from_parts(header: &'a mut Header, iovs: &'a [Iovec], bytes: transfer::Len) -> Self {
43        *header = Header::new();
44        header.bind(iovs);
45        Self {
46            message: Message { header },
47            iovs,
48            bytes,
49        }
50    }
51}
52
53/// A complete immutable send pointer graph.
54#[derive(Clone, Copy)]
55#[repr(transparent)]
56pub struct Message<'a> {
57    header: &'a Header,
58}
59
60// SAFETY: construction bounds the iovec count and byte sum, and Message retains
61// the frozen header and its complete input graph through 'a.
62unsafe impl<'a> io::raw::Message<'a> for Message<'a> {
63    fn header(self) -> &'a Header {
64        self.header
65    }
66}
67
68const _: () = {
69    assert!(mem::size_of::<Message<'static>>() == mem::size_of::<&Header>());
70    assert!(mem::align_of::<Message<'static>>() == mem::align_of::<&Header>());
71    assert!(mem::size_of::<Option<Message<'static>>>() == mem::size_of::<Message<'static>>());
72};