Skip to main content

dope_sys/io/request/
borrow.rs

1use std::mem;
2
3use libc::socklen_t;
4use o3::{base::marker::ThreadBound, buffer::bytes};
5
6use crate::{io, io::socket::addr};
7
8/// Native requests retaining every input address through their borrow.
9#[repr(transparent)]
10pub struct Borrowed<'a, I>(Retained<'a, I>, ThreadBound);
11
12pub enum Retained<'a, I> {
13    Accept {
14        listener: I,
15        addr: &'a mut libc::sockaddr_storage,
16        len: &'a mut socklen_t,
17    },
18    Send {
19        slot: I,
20        input: bytes::Prefix<'a, { i32::MAX as usize }>,
21    },
22    SendMsg {
23        slot: I,
24        msg: &'a io::socket::msg::Header,
25    },
26    Connect {
27        slot: I,
28        addr: addr::Addr<'a>,
29    },
30}
31
32impl<'a, I> Borrowed<'a, I> {
33    pub fn send(slot: I, input: bytes::Prefix<'a, { i32::MAX as usize }>) -> Self {
34        Self(Retained::Send { slot, input }, ThreadBound::NEW)
35    }
36
37    pub fn send_msg<M: io::raw::Message<'a>>(slot: I, message: M) -> Self {
38        Self(
39            Retained::SendMsg {
40                slot,
41                msg: message.header(),
42            },
43            ThreadBound::NEW,
44        )
45    }
46
47    pub fn accept(
48        listener: I,
49        address: &'a mut libc::sockaddr_storage,
50        len: &'a mut socklen_t,
51    ) -> Self {
52        const CAPACITY: socklen_t = {
53            assert!(mem::size_of::<libc::sockaddr_storage>() <= socklen_t::MAX as usize);
54            mem::size_of::<libc::sockaddr_storage>() as socklen_t
55        };
56        *len = CAPACITY;
57        Self(
58            Retained::Accept {
59                listener,
60                addr: address,
61                len,
62            },
63            ThreadBound::NEW,
64        )
65    }
66
67    pub fn connect(slot: I, addr: addr::Addr<'a>) -> Self {
68        Self(Retained::Connect { slot, addr }, ThreadBound::NEW)
69    }
70
71    pub fn into_inner(self) -> Retained<'a, I> {
72        self.0
73    }
74}